特點(diǎn)
- Mysql 5.6之前版本,只有myisam支持全文索引乃秀,5.6之后肛著,Innodb和myisam均支持全文索引
- ngram全文解析器,用來(lái)支持中文跺讯、日文、韓文分詞
- 只有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)使用自然語(yǔ)言模式
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無(wú)效
-
如何設(shè)置
在配置文件中修改檬贰,對(duì)于docker(本人安裝的是mysql:5.7.33)安裝的數(shù)據(jù)庫(kù)姑廉,需要進(jìn)入容器內(nèi),修改
/etc/mysql/mysql.conf.d
文件對(duì)于非docker安裝的數(shù)據(jù)庫(kù)翁涤,修改
/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ù),并重新建立全文索引>胛鳌能真!
問(wèn)題
查詢數(shù)據(jù)不完整?如數(shù)據(jù)中明明存在
文言文
, 但是查詢文言
的時(shí)候查詢不到
解決方案
- 使用
boolean mode
通配符模式。如有單詞calculate, 查詢匹配為select * from articles where match(title,body) AGAINST('cal*' in boolean mode);
即可扰柠,如果用普通的自然語(yǔ)言模式+通配符則查詢不到 - 調(diào)整
ngram_token_size
的大小至合適的長(zhǎng)度
查詢模式
ngram Parser Term Search
- 模式查詢
- 在NATURAL LANGUAGE MODE檢索模式下粉铐,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為若干個(gè)ngram詞語(yǔ)的聯(lián)合
- 字符串“管理開(kāi)發(fā)”(假設(shè)ngram_token_size=2)會(huì)被轉(zhuǎn)換為“管理 理開(kāi) 開(kāi)發(fā)”。給出多行記錄卤档,這多條記錄都匹配檢索詞語(yǔ)“管理 理開(kāi) 開(kāi)發(fā)”蝙泼,只要包含其中之一即可,匹配其一即可返回
- 在BOOLEAN MODE檢索模式下劝枣,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為一個(gè)ngram短語(yǔ)檢索
- 例如汤踏,字符串“項(xiàng)目中管理”(假設(shè)ngram_token_size=2)會(huì)被轉(zhuǎn)換為“項(xiàng)目 目中 中管 管理”。給出多行記錄舔腾,這多條記錄都匹配檢索詞語(yǔ)“項(xiàng)目 目中 中管 管理”溪胶。但是只有包含 “項(xiàng)目中管理” 的記錄行匹配檢索短語(yǔ) ‘“項(xiàng)目 目中 中管 管理”’,完全匹配才可返回
- 在NATURAL LANGUAGE MODE檢索模式下粉铐,查詢關(guān)鍵字表達(dá)式被轉(zhuǎn)換為若干個(gè)ngram詞語(yǔ)的聯(lián)合
ngram Parser Wildcard Search
- 通配符查詢
- 如果查詢的通配符長(zhǎng)度小于ngram token size
- 如果查詢的通配符長(zhǎng)度小于ngram token size, 查詢返回所有索引的行稳诚,這些行包含以前綴術(shù)語(yǔ)開(kāi)頭的ngram token
- 如果查詢的通配符長(zhǎng)度大于ngram token size
- 該前綴詞語(yǔ)會(huì)被轉(zhuǎn)換為一個(gè)ngram短語(yǔ)哗脖,與此同時(shí),通配符符號(hào)會(huì)被忽略扳还。例如才避,假設(shè)ngram_token_size=2,“管理開(kāi)發(fā) *”通配符檢索會(huì)被轉(zhuǎn)換為“管理 開(kāi)發(fā)”(“ngram Parser Term Search”的BOOLEAN MODE)
- 如果查詢的通配符長(zhǎng)度小于ngram token size
ngram Parser Phrase Search
- 短語(yǔ)查詢
- 例如氨距,檢索短語(yǔ)“abc”會(huì)被轉(zhuǎn)換為“ab bc”桑逝,包含“abc”和“ab bc”的記錄都會(huì)被返回。檢索短語(yǔ)“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