全文本搜索不同於通配符和正則表達式搜索,它使用索引進行搜索,相比於前兩者更高效,結果更加智能。
之前已經瞭解過,對於最常見的兩種引擎MyISAM和InnoDB來說,前者支持全文本搜索,而後者不支持。
爲了支持全文本搜索,必須定義被索引的列。一般在創建表時啓用全文本搜索。
我們假設要創建一個productnotes的表:
在這張表的定義中,我們使用FULLTEXT(note_text)定義了被索引的列爲note_text,注意引擎一定要選擇支持全文本操作的MyISAM。
表的內容如下:
定義了全文本搜索之後,無論後續表會進行插入、更新或者刪除,note_text這一列都會進行自動的索引。
在建立索引之後,使用Match()和Aganist()來進行全文本搜索,Match()指定被搜索的列,Aganist()指定要搜索的表達式。
如我們要索引note_text列包含rabbit的行:
結果返回了包含rabbit的兩行數據,並且是有序輸出。
傳遞給Match的值必須是定義的索引列,且全文本搜索是不區分大小寫的,使用rabbit也可以搜索到RAbbit。
使用查詢擴展
查詢擴展可以搜索到更多的行,甚至這些行不包含rabbit。
可以看到使用了WITH QUERY EXPANSION的全文本搜索,輸出了6行數據,首先前兩行是包含rabbit的行,其他都是包含了前兩行中其他詞的行。
布爾文本搜索
全文本搜索的另一種方式是布爾文本搜索,常用的布爾操作符如下:
搜索包含rabbit和bait的行:
搜索包含rabbit bait這個短語的行:
搜索rabbit和carrot,增加前者等級,降低後者等級:
使用全文本搜索的幾個說明:
50%規則:如果表的行數少於三行,則全文本搜索不返回結果;
單引號:忽略詞中的單引號,don't的索引爲dont;