1. 程式人生 > >MySQL 5.7 中文全文檢索使用教程

MySQL 5.7 中文全文檢索使用教程

在MySQL 5.7.6之前,全文索引只支援英文全文索引,不支援中文全文索引,需要利用分詞器把中文段落預處理拆分成單詞,然後存入資料庫。
從MySQL 5.7.6開始,MySQL內建了ngram全文解析器,用來支援中文、日文、韓文分詞。
本文使用的MySQL 版本是5.7.22,InnoDB資料庫引擎。

ngram全文解析器

ngram就是一段文字裡面連續的n個字的序列。ngram全文解析器能夠對文字進行分詞,每個單詞是連續的n個字的序列。例如,用ngram全文解析器對“生日快樂”進行分詞:

n=1: '生', '日', '快', '樂' 
n=2: '生日', '日快', '快樂' n=3: '生日快', '日快樂' n=4: '生日快樂' 

MySQL 中使用全域性變數ngram_token_size來配置ngram中n的大小,它的取值範圍是1到10,預設值是2。通常ngram_token_size設定為要查詢的單詞的最小字數。如果需要搜尋單字,就要把ngram_token_size設定為1。在預設值是2的情況下,搜尋單字是得不到任何結果的。因為中文單詞最少是兩個漢字,推薦使用預設值2。

全域性變數ngram_token_size的兩種設定方法:
1、啟動mysqld命令時

mysqld --ngram_token_size=2

2、修改MySQL配置檔案

[mysqld] 
ngram_token_size=2

建立全文索引

1、建立表的同時建立全文索引

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;

2、通過 alter table 的方式來新增

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

3、直接通過create index的方式

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

全文檢索模式

常用的全文檢索模式有兩種:
1、自然語言模式(NATURAL LANGUAGE MODE) ,
自然語言模式是MySQL 預設的全文檢索模式。自然語言模式不能使用操作符,不能指定關鍵詞必須出現或者必須不能出現等複雜查詢。
2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支援指定關鍵詞必須出現或者必須不能出現或者關鍵詞的權重高還是低等複雜查詢。

示例

SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一帶' IN NATURAL LANGUAGE MODE); // 不指定模式,預設使用自然語言模式 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('一路 一帶'); 
  示例

上面的示例返回結果會自動按照相關性排序,相關性高的在前面。相關性的值是一個非負浮點數,0表示無相關性。

// 獲取相關性的值
SELECT id,title,
MATCH (title,body) AGAINST ('手機' IN NATURAL LANGUAGE MODE) AS score
FROM articles
ORDER BY score DESC;
  示例
// 獲取匹配結果記錄數
SELECT COUNT(*) FROM articles
WHERE MATCH (title,body) AGAINST ('一路 一帶' IN NATURAL LANGUAGE MODE); 

可以使用BOOLEAN模式執行高階查詢。

// 必須包含"騰訊"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+騰訊' IN BOOLEAN MODE); 
  示例
// 必須包含"騰訊",但是不能包含"通訊工具"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+騰訊 -通訊工具' IN BOOLEAN MODE);
  示例

下面的例子演示了BOOLEAN模式下運算子的使用方式:

'apple banana' 
無操作符,表示或,要麼包含apple,要麼包含banana

'+apple +juice'
必須同時包含兩個詞

'+apple macintosh'
必須包含apple,但是如果也包含macintosh的話,相關性會更高。

'+apple -macintosh'
必須包含apple,同時不能包含macintosh。

'+apple ~macintosh' 必須包含apple,但是如果也包含macintosh的話,相關性要比不包含macintosh的記錄低。 '+apple +(>juice <pie)' 查詢必須包含apple和juice或者apple和pie的記錄,但是apple juice的相關性要比apple pie高。 'apple*' 查詢包含以apple開頭的單詞的記錄,如apple、apples、applet。 '"some words"' 使用雙引號把要搜素的詞括起來,效果類似於like '%some words%', 例如“some words of wisdom”會被匹配到,而“some noise words”就不會被匹配。 

注意

  • 只能在型別為CHAR、VARCHAR或者TEXT的欄位上建立全文索引。
  • 全文索引只支援InnoDB和MyISAM引擎。
  • MATCH (columnName) AGAINST ('keywords')。MATCH()函式使用的欄位名,必須要與建立全文索引時指定的欄位名一致。如上面的示例,MATCH (title,body)使用的欄位名與全文索引ft_articles(title,body)定義的欄位名一致。如果要對title或者body欄位分別進行查詢,就需要在title和body欄位上分別建立新的全文索引。
  • MATCH()函式使用的欄位名只能是同一個表的欄位,因為全文索引不能夠跨多個表進行檢索。
  • 如果要匯入大資料集,使用先匯入資料再在表上建立全文索引的方式要比先在表上建立全文索引再匯入資料的方式快很多,所以全文索引是很影響TPS的。


作者:jessehua
連結:https://www.jianshu.com/p/c48106149b6a
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。