啟動全文本搜索
CREATE TABLE productnotes
{
node_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;
- 這些列中有一個名為note_text的列,為了進行全文本搜索,MySQL根據子句FULLTEXT(note_text)的指示對它進行索引。這里的FULLTEXT索引單個列,如果需要也可以指定多個列。
- 在定義之后,MySQL自動維護該索引。在增加、更新或刪除行時,索引隨之自動更新。
- 可以在創建表時指定FULLTEXT,或者在稍后指定(在這種情況下所有已有數據必須立即索引)。
進行全文本搜索
mysql> SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbi')
+------------------------------------------------------------------------------------------+
| note_text |
+------------------------------------------------------------------------------------------+
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now. |
| Quantity varies, sold by the sack load.All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
+------------------------------------------------------------------------------------------+
2 rows in set (0.03 sec)
- Match()指定被搜索的列,Against()指定要使用的搜索表達式。
- 使用完整的 Match() 說 明 傳遞給 Match() 的值必須與FULLTEXT()定義中的相同。如果指定多個列,則必須列出它們(而且次序正確)。
- 搜索不區分大小寫 除非使用BINARY方式,否則全文本搜索不區分大小寫。
全文本匹配等級
select note_text,match(note_text) AGAINST('rabbit')AS rank FROM productnotes;
-
Match()和Against()用來建立一個計算列(別名為rank),此列包含全文本搜索計算出的等級值。等級由MySQL根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的數目計算出來。正如所見,不包含詞rabbit的行等級為0(因此不被前一例子中WHERE子句選擇)。確實包含詞rabbit的兩個行每行都有一個等級值,文本中詞靠前的行的等級值比詞靠后的行的等級值高。
-
排序多個搜索項 如果指定多個搜索項,則包含多數匹配詞的那些行將具有比包含較少詞(或僅有一個匹配)的那些行高的等級值。
使用查詢擴展
SELECT note_text FROM productnotes Match(note_text) Against('anvils' WITH QUERY EXPANSION);
- 這次返回了7行。第一行包含詞anvils,因此等級最高。第二行與anvils無關,但因為它包含第一行中的兩個詞(customer和recommend),所以也被檢索出來。第3行也包含這兩個相同的詞,但它們在文本中的位置更靠后且分開得更遠,因此也包含這一行,但等級為第三。第三行確實也沒有涉及anvils(按它們的產品名)。
- 正如所見,查詢擴展極大地增加了返回的行數,但這樣做也增加了你實際上並不想要的行的數目。
布爾文本搜索![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ORwwE0Dh-1592563655670)(/home/cmf/.config/Typora/typora-user-images/image-20200619184012720.png)]](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzIwMjAwNjE5MTg0NzQ5MjcucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2Uvd2F0ZXJtYXJrLHR5cGVfWm1GdVozcG9aVzVuYUdWcGRHayxzaGFkb3dfMTAsdGV4dF9hSFIwY0hNNkx5OWliRzluTG1OelpHNHVibVYwTDBOa2NtVmhiV1pzZVE9PSxzaXplXzE2LGNvbG9yX0ZGRkZGRix0Xzcw.png)
- 然匹配詞heavy,但-rope明確地指示MySQL排除包含rope。
全文本布爾操作符
布 爾 操 作 符 | 說 明 |
---|---|
+ | 包含,詞必須存在 |
- | 排除,詞必須不出現 |
> | 包含,而且增加等級值 |
< | 包含,且減少等級值 |
() | 把詞組成子表達式(允許這些子表達式作為一個組被包含、排除、排列等) |
~ | 取消一個詞的排序值 |
* | 詞尾的通配符 |
"" | 定義一個短語(與單個詞的列表不一樣,它匹配整個短語以便包含或排除這個短語) |
全文本搜索的使用說明
- 索引全文本數據時,短詞被忽略且從索引中排除。短詞定義為那些具有3個或3個以下字符的詞(如果需要,這個數目可以更改)。
- MySQL帶有一個內建的非用詞(stopword)列表,這些詞在索引全文本數據時總是被忽略。如果需要,可以覆蓋這個列表(請參閱MySQL文檔以了解如何完成此工作)。
- 許多詞出現的頻率很高,搜索它們沒有用處(返回太多的結果)。因此,MySQL規定了一條50%規則,如果一個詞出現在50%以上的行中,則將它作為一個非用詞忽略。50%規則不用於IN BOOLEAN MODE。
- 如果表中的行數少於3行,則全文本搜索不返回結果(因為每個詞或者不出現,或者至少出現在50%的行中)。
- 忽略詞中的單引號。例如,don't索引為dont。
- 不具有詞分隔符(包括日語和漢語)的語言不能恰當地返回全文本搜索結果。
- 如前所述,僅在MyISAM數據庫引擎中支持全文本搜索。