02全文本搜索

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);

全文本布尔操作符

布尔操作符 说明
+ 包含,词必须存在
- 排除,词必须不出现
> 包含,而且增加等级值
< 包含,而且减少等级制
() 把词组成表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容