特點(diǎn)
- Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引
- ngram全文解析器,用來支持中文、日文、韓文分詞
- 只有char、varchar、text類型字段能創(chuàng)建全文索引
- 英文分詞用空格,逗號(hào);中文分詞用 ngram_token_size 設(shè)定
創(chuàng)建全文索引
-
創(chuàng)建表的時(shí)候創(chuàng)建
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR (200), body TEXT, FULLTEXT (title, body) WITH PARSER ngram ) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
-
創(chuàng)建表之后創(chuàng)建
ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;
查詢
-
不指定模式,默認(rèn)使用自然語言模式
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文');
-
指定模式
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文' IN NATURAL LANGUAGE MODE); SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文' IN BOOLEAN MODE);
相關(guān)參數(shù)
innodb_ft_min_token_size
- 默認(rèn)3,表示最小3個(gè)字符作為一個(gè)關(guān)鍵詞,增大該值可減少全文索引的大小
innodb_ft_max_token_size
- 默認(rèn)84,表示最大84個(gè)字符作為一個(gè)關(guān)鍵詞,限制該值可減少全文索引的大小
ngram_token_size
默認(rèn)2,表示2個(gè)字符作為內(nèi)置分詞解析器的一個(gè)關(guān)鍵詞,如對(duì)“abcd”建立全文索引,關(guān)鍵詞為’ab’,‘bc’,‘cd’
當(dāng)使用ngram分詞解析器時(shí),innodb_ft_min_token_size和innodb_ft_max_token_size無效
-
如何設(shè)置
在配置文件中修改,對(duì)于docker(本人安裝的是mysql:5.7.33)安裝的數(shù)據(jù)庫,需要進(jìn)入容器內(nèi),修改
/etc/mysql/mysql.conf.d
文件對(duì)于非docker安裝的數(shù)據(jù)庫,修改
/etc/my.cnf
。這都是在默認(rèn)情況下的配置文件,具體到每個(gè)人,可能會(huì)不一樣[mysqld] ngram_token_size = 1 innodb_ft_min_token_size = 1 innodb_ft_max_token_size = 84
這三個(gè)參數(shù)均不可動(dòng)態(tài)修改,修改了這些參數(shù),需重啟MySQL服務(wù),并重新建立全文索引!!
問題
查詢數(shù)據(jù)不完整?如數(shù)據(jù)中明明存在
文言文
, 但是查詢文言
的時(shí)候查詢不到
解決方案
- 使用
boolean mode
通配符模式。如有單詞calculate, 查詢匹配為select * from articles where match(title,body) AGAINST('cal*' in boolean mode);
即可,如果用普通的自然語言模式+通配符則查詢不到 - 調(diào)整
ngram_token_size
的大小至合適的長度
查詢模式
ngram Parser Term Search
- 模式查詢
- 在NATURAL LANGUAGE MODE檢索模式下,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為若干個(gè)ngram詞語的聯(lián)合
- 字符串“管理開發(fā)”(假設(shè)ngram_token_size=2)會(huì)被轉(zhuǎn)換為“管理 理開 開發(fā)”。給出多行記錄,這多條記錄都匹配檢索詞語“管理 理開 開發(fā)”,只要包含其中之一即可,匹配其一即可返回
- 在BOOLEAN MODE檢索模式下,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為一個(gè)ngram短語檢索
- 例如,字符串“項(xiàng)目中管理”(假設(shè)ngram_token_size=2)會(huì)被轉(zhuǎn)換為“項(xiàng)目 目中 中管 管理”。給出多行記錄,這多條記錄都匹配檢索詞語“項(xiàng)目 目中 中管 管理”。但是只有包含 “項(xiàng)目中管理” 的記錄行匹配檢索短語 ‘“項(xiàng)目 目中 中管 管理”’,完全匹配才可返回
- 在NATURAL LANGUAGE MODE檢索模式下,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為若干個(gè)ngram詞語的聯(lián)合
ngram Parser Wildcard Search
- 通配符查詢
- 如果查詢的通配符長度小于ngram token size
- 如果查詢的通配符長度小于ngram token size, 查詢返回所有索引的行,這些行包含以前綴術(shù)語開頭的ngram token
- 如果查詢的通配符長度大于ngram token size
- 該前綴詞語會(huì)被轉(zhuǎn)換為一個(gè)ngram短語,與此同時(shí),通配符符號(hào)會(huì)被忽略。例如,假設(shè)ngram_token_size=2,“管理開發(fā) *”通配符檢索會(huì)被轉(zhuǎn)換為“管理 開發(fā)”(“ngram Parser Term Search”的BOOLEAN MODE)
- 如果查詢的通配符長度小于ngram token size
ngram Parser Phrase Search
- 短語查詢
- 例如,檢索短語“abc”會(huì)被轉(zhuǎn)換為“ab bc”,包含“abc”和“ab bc”的記錄都會(huì)被返回。檢索短語“abc def”會(huì)被轉(zhuǎn)換為“ab bc de ef”,包含“abcdef”的記錄不會(huì)被返回
參考:
https://blog.csdn.net/u013887008/article/details/106757993
https://zhuanlan.zhihu.com/p/88275060