MySQL-18全文字搜尋-必知必會
阿新 • • 發佈:2021-01-02
MyISAM引擎支援全文字搜尋,InnoDB不支援全文字搜尋。
之前學習的萬用字元和正則表示式匹配通常需要MySQL嘗試匹配表中的所有行,非常耗時;很難控制匹配什麼和不匹配什麼;不能提供一種智慧化的選擇結果的方法。
-
啟動全文字搜尋支援
CREATE TABLE productnoted ( node_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_data datetime NOT NULL, note_text text NULL, PRIMARY KEY(note_id), FULLTEXT(note_text) )ENGINE=MyISAM;
為了進行全文字搜尋,MySQL根據FULLTEXT(note_text)的指示對它進行索引,在定義之後MySQL自動維護該索引,在增刪改時,索引隨之自動更新。
可以在建立表時指定FULLTEXT,也可以在之後指定。不要在匯入資料時使用FULLTEXT,先匯入後修改表。
-
進行全文字搜尋
在索引之後使用Match()和Against()函式執行全文字搜尋。
-
Match()指定被搜尋的列
-
Against()指定要使用的搜尋表示式
SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit'); #此SELECT語句能夠檢索單個列note_text,通過Against函式指定'rabbit'作為搜尋文字,含有該文字的行將被返回/不區分大小寫
-
-
使用查詢擴充套件
查詢擴充套件用來設法放寬所返回的全文字搜尋結果的範圍,比如查詢與某個詞有關的其他行。需要對資料和索引進行兩遍掃描
- 1、進行一個基本的全文字掃描,找出與搜尋條件匹配的所有行
- 2、檢查這些匹配並選擇所有的詞
- 3、再次進行全文字搜尋,原來的條件加上步驟2的所有有用的詞
#下邊例子值返回一行包含詞'rabbit' SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit'); #使用查詢擴充套件,在要查詢的詞後+WITH QUERY EXPANSION SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
-
布林文字搜尋
支援全文字搜尋的另外一種形式,布林方式,沒有FULLTEXT索引也可以使用,可以提供關於如下內容的細節:
-
要匹配的詞
#在note_text列檢索包含詞rabbit的所有行,結果與沒有指定布林操作相同 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' IN BOOLEAN MODE); #這個搜尋匹配包含詞rebbit和bait的行 SELECT note_text FROM productnoted WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE); #這個搜尋匹配包含兩個詞至少一個的行 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE); #這個搜尋匹配短語 rabbit bait SELECT note_text FROM productnoted WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);
-
要排斥的詞
#匹配包含rabbit但不包含任何以rope開頭的詞的行。 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit -rope*' IN BOOLEAN MODE);
-
排列提醒,指定優先順序更高的詞
#這個搜尋匹配rabbit和bait,增加前者的等級,降低後者的等級 SELECT note_text FROM productnoted WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE); #這個搜尋匹配rabbit和bait,降低後者的等級 SELECT note_text FROM productnoted WHERE Match(note_text) Against('+rabbit +(<bait)' IN BOOLEAN MODE);
-
表示式分組
-
另外一些內容
-