全文本搜索

1、启用索引

MySQL支持几种基本的数据库引擎,MySQL最长用的两个引擎为:MyISAM和InnoDB:

MyISAM支持全文本搜索,查询效率高;但局限在于不支持事务和外键;

InnoDB支持事务和外键,和MyISAM各有优劣;

与全文本搜索功能类似的有通配符正则表达式匹配,但性能较低,通常会匹配表的所有行,而且这些搜索极少使用表索引,不能做到明确控制,且返回的结果不智能化;

在使用全文本搜索时,mysql不需要分别查看每个行,不需要分析和处理每个词,只需索引被搜索的列(需要随着数据的改变不断重新索引)

一般在创建表时启用全文本搜索(必须索引被搜索的列),create table语句接受fulltext子句,它给出被索引列的一个逗号分隔的列表;

例如:

CREATE TABLE productnotes
(
note_id int not null auto_incerement,

prod_id char(10) not null,

note_date datetime not null,

note_text text null,

primary key(note_id),

fulltext(note_text)

) engine = MyISAM;

这条create table语句定义表productnotes并列出它所包含的列即可;其中MySQL根据子句fulltext对(note_text)进行索引。

在定义之后,MySQL自动维护该索引;在增加、删除、或更新行时,索引随之自动更新。

PS:不要再导入数据时使用fulltext,这样有助于更快的导入数据。

2、执行索引

启用索引后,使用**match()against()**执行全文本搜索;其中match()指定被搜索的列,against()指定要使用的搜索表达式。

例如:

select note_text

from productnotes

where match(note_text) against(‘rabbit’);

这条select语句检索单个列note_text,由于where子句,一个全文本搜索被执行;match(note_text)指示MySQL针对指定的列进行搜索,against(‘rabbit’)指定rabbit作为搜索文本。

**PS:**传递给match()的值必须与fulltext()定义中的相同;如果指定多个列,则必须列出它们(次序正确);除非使用binary方式,否则全文本搜索不区分大小写(上面的例子没有使用该方式)。

like子句具有和全文本搜索相同的功能,但区别在于:全文本搜索的特点是对结果进行排序,具有较高等级的行先返回(如果排序多个搜索项,则包含多数匹配词的行将具有更高的优先级)。

3、查询扩展

作用:用来设法放宽所返回的全文本搜索结果的范围(MySQL对数据和索引进行两遍扫描来完成搜索)。

检索过程:

进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;

MySQL检查这些匹配行并选择所有有用的词(将会简要的解释MySQL如何断定什么有用什么无用);

MySQL再次进行全文本搜索,这次不仅使用原来的条件,还是用所有有用的词。

**用法:**where子句中against指定的搜索表达式后跟with query erpansion;

**比如:**where match(note_text) against(‘rabbit’ with query erpansion);

**PS:**表中的行越多(行的文本越多),实用查询扩展返回的结果越好。

4、布尔文本搜索

MySQL还支持另一种全文本搜索方式,称为布尔方式(boolean mode);使用布尔方式需要提供一下条件:

要匹配的词;

要排斥的词(如果某行包含这个词,则不返回,即使它包含其他指定的词也是如此);

排列提示(指定某些词比其他词重要,更重要的词返回的等级更高);

表达式分组;

其他的内容。

**PS:**即使没有fulltext索引也可以使用布尔方式(但这种方式很缓慢)。

例如:select note_text

​ from productnotes

​ where match(note_text) against(‘heavy -rope*’ in bollean mode);

此全文本搜索检索包含词heavy的所有行,其中使用了in boolean mode以及布尔操作符,-rope指示MySQL排除包含rope(任何以rope开始的词)的行。

全文本布尔操作符列表如下:

在这里插入图片描述

下面列举几个例子,说明这些操作符的使用:

这个搜索匹配包含次rabbit和biat的行:

select note_text

from froductnotes

where match(note_text) against(’+rabbit +bait’ in boolean mode);

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

select note_text

from froductnotes

where match(note_text) against(‘rabbit bait’ in boolean mode);

这个搜索匹配短语rabbit bait而不是匹配两个词rabbit和bait:

select note_text

from froductnotes

where match(note_text) against(’“rabbit bait”’ in boolean mode);

**PS:**在布尔方式中,不按照等级降序排序返回的行。

5、全文本搜索使用说明

在索引全文本数据时,短词被忽略且从索引中删除(短词定义为3个或3个以下字符的词:如果需要可以更改);

MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本搜索时总被忽略(如果需要,可以覆盖这个列表);

MySQL50%规则:如果一个词出现在50%以上的行中,则将它作为一个非用词忽略;50%规则不用于in boolean mode;

如果表中的行数少于3行,则全文本搜索不返回结果;

忽略词中的单引号,例如don’t索引为dont;

不具有词分隔符的语言不能恰当的返回全文本搜索结果;

仅在MyISAM数据库引擎中支持全文本搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值