全文本搜索
一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
creat table tb(
c1 int not null,
c2 varchar(32) not null,
note_text text null,
primary key(c1),
FULLTEXT(note_text)
)engine=MyISAM
MySQL根据子句FULLTEXT(note_text)的指示对它进行索引。
这里的FULLTEXT索引单个列,如果需要也可以指定多个列。
不要在导入数据时使用FULLTEXT,因为更新索引要花时间。
在索引之后,使用两个函数Match()和Against()执行全文本搜索
- Match()指定被搜索的列
- Against()指定要使用的搜索表达式。
select note_text from tb
where match(note_text) against('rabbit')
传递给Match()的值必须与FULLTEXT()定义中的相同。
如果指定多个列,则必须列出它们
查询扩展
select note_text from tb
where match(note_text) against('rabbit' with query expansion)
布尔索引
+ 包含,词必须存在
- 排除,词必须不出现
> 包含,而且增加等级值
< 包含,且减少等级值
() 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以
便包含或排除这个短语)
下面这个搜索匹配包含词rabbit和bait的行
select note_text from tb
where match(note_text) against('+rabbit +bait' IN BOOLEAN MODE)
下面没有指定操作符,这个搜索匹配包含rabbit和bait中的至少一 个词的行。
select note_text from tb
where match(note_text) against('rabbit bait' IN BOOLEAN MODE)
下面这个搜索匹配短语rabbit bait而不是匹配两个词rabbit和 bait。
select note_text from tb
where match(note_text) against('"rabbit bait"' IN BOOLEAN MODE)