理解全文本搜索
- 比LIKE、正則表達式更智能,不會因數據量增大損失性能。
並非所有引擎都支撐全文本
- 最常用的兩個引擎MyISAM和InnoDB,前者支撐全文本搜索,而後者不支持。
使用全文本搜索
爲進行全文本搜索,必須索引被搜索的列,而且要隨着數據的改變不斷地重新索引。對錶列進行適當設計後,MySQL會自動進行所有的索引和重新索引。
在索引之後,SELECT可與Match()和Against()一起使用以實際執行搜索。
啓用全文本搜索支持
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 #更換爲MyISAM引擎
- Match()內的值必須與FULLTEXT()定義中的相同,如果指定多個列,則必須順序正確的列出它們。
- 爲進行全文本搜索,MySQL根據FULLTEXT(…)的指示對它進行索引,()中可以索引單個列,也可以多個。
- FULLTEXT(…)儘量在create table 表名(…)中的最後面。
布爾文本搜索(沒FULLTEXT也可用)
- 要匹配的詞
- 要排斥的詞
- 排列提示(某詞比某詞更重要,更重要的詞等級更高)
- 表達式分組
例如:
SELECT note_text FROM productnotes
WHERE Match(note_text)
Against('heavy -rope*' IN BOOLEAN MODE);
\#意思是匹配詞heavy,但排除包含rope的詞或者行
布爾文本操作符 | 描述 |
---|---|
+ | 包含,詞必須存在 |
- | 排斥,詞必須不存在 |
> | 包含,且增加等級 |
< | 包含,且減少等級 |
( ) | 把詞組成子表達式 |
~ | 取消一個詞的排序值 |
* | 詞尾的通配符 |
“” | 定義一個短語 |
注意!
- 不要在導入數據時使用FULLTEXT:更新索引花時間,如果正在導入數據到一個新表,則不該此時啓用FULLTEXT索引。應首先導入數據,然後修改表,定義FULLTEXT。
- 如果一個詞的頻率出現超過50%則忽略,不用於布爾文本搜索。