理解全文本搜索
- 比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%则忽略,不用于布尔文本搜索。