【MySQL必知必会(十五)】【全文本搜索】

上一篇:【MySQL必知必会(十四)】【组合查询】

+++++++++++++开始线++++++++++++++++

一、 理解全文本搜索

几个重要的限制:
1.性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行。因此,由于被搜索行数不断增加,这些搜索可能非常耗时
2.明确控制:使用通配符和正则表达式匹配,很难明确地控制匹配什么和不匹配什么
3.智能化的结果:虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法

二、 使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。
在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。

2.1启用全文本搜索支持

一般在创建表时启用全文本搜索。CREATE TABLE接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表

mysql> 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.2 进行全文本搜索

Match()指定被搜索的列,Against()指定要使用的搜索表达式

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('rabbit');

在这里插入图片描述

使用完整的Match()说明

传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们并且次序正确

上个例子也可以简单地用LIKE子句完成

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE note_text LIKE '%rabbit%';

在这里插入图片描述

2.4 布尔文本搜索

在这里插入图片描述

MySQL支持全文本搜索的另外一种形式,称为布尔方式

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);

在这里插入图片描述

匹配包含heavy但不包含任意以rope的开始的词的行

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);

在这里插入图片描述

搜索包含rabbit和bait的行

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);

在这里插入图片描述

没有指定操作符,这个搜索匹配包含rabbit和bait中的至少一个词的行

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);

在这里插入图片描述

匹配短语rabbit bait

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('"rabbit bait"'IN BOOLEAN MODE);

在这里插入图片描述

匹配rabbit和carrot,增加前者的等级,降低后者的等级

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);

在这里插入图片描述

2.5 全文本搜索的使用说明

1.在索引全文本数据时,短词被忽略且从索引中排除
2.MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总是被忽略
3.如果表中的行数小于3行,则全文本搜索不返回结果
4.忽略词中的单引号
5.仅在MyISAM数据库引擎中支持全文本搜索

+++++++++++++结束线++++++++++++++++

下一篇:【MySQL必知必会(十六)】【插入数据】

猜你喜欢

转载自blog.csdn.net/qq_42893334/article/details/108848050
今日推荐