1、启用全文本搜索
FULLTEXT对指定列进行索引
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;
不要在导入数据时使用FULLTEXT。可以先导入数据,在修改表结构增加FULLTEXT
2、进行全文本搜索
select note_text
from productnotes
where match(note_text) against('rabbit')
搜索结果根据文本匹配良好程度排序数据。
select note_text,match(note_text) against('rabbit')
from productnotes
3、扩展搜索
select note_text
from productnotes
where match(note_text) against('rabbit' with query expansion)
根据rabbit搜索出相关的数据行,我们可以根据此数据行的结果查询出更多的数据。
在使用查询扩展是,MySQL对数据和索引进行两遍扫描来完成搜索:
- 首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有航
- 其次,MySQL检查这些匹配行并选择所有有用的词
- 再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还是用使用所有有用的词
4、布尔文本搜索
select ntoe_text
from productnotes
where match(note_text) against('heavy' in boolean mode);
此全文本搜索检索包含词heavy的所有行,其中使用了关键字 in boolean mode,但是实际上没有指定布尔操作符,因此,结果与没有指定布尔方式结果相同。
- 匹配包含heavy但不包含任意以rope开始的词的行
select ntoe_text
from productnotes
where match(note_text) against('heavy -rope*' in boolean mode);
全文本布尔操作符
布尔操作符 | 说明 |
---|---|
+ | 包含,词必须存在 |
- | 排除,词必须不出现 |
> | 包含,而且增加等级值 |
< | 包含,而且减少等级制 |
() | 把词组成表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
~ | 取消一个词的排序值 |
* | 词尾的通配符 |
"" | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |