【資料分析師_02_SQL+MySQL】022_MySQL的全文檢索(MyISAM,MATCH AGAINST)
MySQL的全文檢索
1 簡介
雖然之前學過的搜尋機制非常有用,但存在幾個重要的限制(萬用字元和正則表示式,WHERE和LIKE):
- 效能——萬用字元和正則表示式匹配通常要求MySQL嘗試匹配表中所有行(而且這些搜尋極少使用表索引)。因此,由於被搜尋行數不斷增加,這些搜尋可能非常耗時。(大量大概可以定義為10G以上)
- 明確控制——使用萬用字元和正則表示式匹配,很難(而且並不總是能)明確地控制匹配什麼和不匹配什麼。例如,指定一個詞必須匹配,一個詞必須不匹配,而一個詞僅在第一個詞確實匹配的情況下才可以匹配或者才可以不匹配。
所有這些限制以及更多的限制都可以用全文字搜尋來解決。在使用全文字搜尋時,MySQL不需要分別檢視每個行,不需要分別分析和處理每個詞。
儲存機制 | 全文索引 | 型別 | 適用於 |
---|---|---|---|
Innodb | 不支援 | 事務性 | 業務表(比如用於模糊查詢) |
MyISAM | 支援 | 資料型 | 資料表 |
productnote | 支援 | 資料型 | 資料表 |
2 案例
2.1 啟用全文索引
注意:不要將業務類的主要表開啟MyISAM!
2.1.1 檢視並啟用表的儲存機制型別(Navicat):
2.1.2 檢視並啟用表的儲存機制型別(CMD):
CREATE TABLE productnotes ( note_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_date datetime NOT NULL, note_text text NULL , PRIMARY KEY(note_id), FULLTEXT(note_text) ) ENGINE = MyISAM ; # 在這裡設定
2.1.3 接下來的設定
首先:全文索引的資料型別必須是TEXT
型別!不能是 char
或者 varchar
型別的!
必須是上圖 TEXT
類的資料,才可以開啟下圖的 FULLTEXT
的全文索引
2.2 進行全文索引
傳統模糊查詢方法:like
和 regex
全文索引模糊查詢方法:MATCH AGAINST
2.2.1 傳統模式(LIKE
):
select note_text from productnotes
where note_text like '%rabbit%' ;
2.2.2 全文索引模式(MATCH AGAINST
+ WHERE
):
select note_text from productnotes where Match (note_text) AGAINST ('rabbit') ;
2.2.3 全文索引模式(匹配優先順序):
注:先出現關鍵字的,優先級別高
注:MATCH AGAINST
寫在 from
前時, MATCH AGAINST
不作為篩選條件,而是顯示為優先順序(下圖第二列)
注:MATCH AGAINST
寫在 from
後時, MATCH AGAINST
作為篩選條件
select note_text, MATCH(note_text) AGAINST ('rabbit') from productnotes
2.2.4 布林全文搜尋(重要)
布林操作符 | 含義 |
---|---|
+ | 必須包含 |
- | 排除 |
> | 包含 增加等級 |
< | 包含 降低等級 |
() | 選擇其一 |
* | 詞尾匹配符 |
"" | 定義短句 |
2.2.4.1 基本應用
在 productnotes 表中用 BOOLEAN 模式查詢所有包含 heavy 的 note_text 欄位:
select note_text from productnotes
where MATCH (note_text)
AGAINST ('heavy' IN BOOLEAN MODE) ;
2.2.4.2 +
的應用
在 productnotes 表中用 BOOLEAN 模式查詢所有包含 rabbit 且包含 bait 的 note_text 欄位:
select note_text from productnotes
where MATCH (note_text)
AGAINST ('+rabbit +bait' IN BOOLEAN MODE) ;
2.2.4.3 -
的應用
在 productnotes 表中用 BOOLEAN 模式查詢所有包含 heavy 且不包含 rope 的 note_text 欄位:
select note_text from productnotes
where MATCH (note_text)
AGAINST ('heavy -rope*' IN BOOLEAN MODE) ;
2.2.4.4 <
和 >
的應用
在 productnotes 表中用 BOOLEAN 模式查詢所有包含 降低優先順序的 combination 的 note_text 欄位:
注:MATCH AGAINST
寫在 from
前時, MATCH AGAINST
不作為篩選條件,而是顯示為優先順序
注:MATCH AGAINST
寫在 from
後時, MATCH AGAINST
作為篩選條件
select note_text, MATCH(note_text)
AGAINST ('+safe +(<combination)' IN BOOLEAN MODE) from productnotes # 這裡的 MATCH AGAINST 顯示為結果中的優先
where MATCH(note_text)
AGAINST ('+safe +(<combination)' IN BOOLEAN MODE) ; #這裡的 MATCH AGAINST 是篩選的作用
2.2.4.5 ()
的應用
在 productnotes 表中用 BOOLEAN 模式查詢所有包含 safe 且包含 (combination 或 accepted) 的 note_text 欄位:
select note_text, MATCH(note_text)
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE) from productnotes # 這裡的 MATCH AGAINST 顯示為結果中的優先順序欄位
where MATCH(note_text)
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE) ; #這裡的 MATCH AGAINST 是篩選的作用
全文搜尋結果不要優先順序的話,可以簡化成:
select note_text from productnotes
where MATCH(note_text)
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE) ;
2.2.4.6 其他的話
BOOLEAN 搜尋其實也運用在百度搜索上,好奇的小夥伴可以去查查用法,很實用,推薦。