MySQL必知必会-第18章 全文本搜索

全文本搜索

1.理解全文本搜索

1)MySQL支持几种基本的数据库引擎,如:MyISAM(咪森),InnoDB;
2)MyISAM支持全文本搜索,而InnoDB不支持;
3)与通配符和正则表达式不同,使用全文本搜索是,MySQL不需要分别查看每个行,不需要分别分析和处理每个词;MySQL【创建指定列中各个词的一个索引】,搜索可以针对这些词进行;

2.启用全文本搜索支持

在创建表格的时候启用

create table 表名(
	note_id int not null auto_increment,
	note_text text NULL,
	note_comment text NULL,	
	primary key(note_id),
	FULLTEXT(note_text,note_comment) -- 对多个指定列进行索引
)ENGINE=MyISAM;                      -- 使用支持全文本索引的MyISAM数据库引擎

1)FULLTEXT(…,…)给出被索引列的一个逗号分隔的列表;
2)可以在创建表的时候指定FULLTEXT,或者创建后指定(所有已有的数据必须立即索引)
3)【不要在导入数据时使用FULLTEXT开启全文本索引】
如果正在导入一个新表,则不应该启用FULLTEXT索引;
应该先导入所有的数据,然后再修改表,定义FULLTEXT,有助于更快地导入数据;(使索引全部数据的总时间 小于 在导入每行时分别进行索引所需要的总时间)

3.进行全文本搜索

使用Match(被索引的列名) Against(要搜索的文本)函数执行全文本搜索

select note_text
from productnotes
where Match(note_text) Against('rabbit');

1)上述语句:在所有行的note_text列中搜索文本’rabbit’;
2)传给Match()的值必须和FULLTEXT()定义中的相同,如果指定多个列,则必须列出它们,且次序正确;
3)全文本搜索默认不区分大小写进行匹配,如果想要区分大小写,要使用Binary方式(这个方式再之前进行字符串匹配的时候有遇到过)

4.全文本搜索排序依据

【全文本搜索与LIKE关键词的一个不同点】
LIKE以不特别有用的顺序返回结果;
而全文本搜索将相关性高的文本排在前面,例如将搜索的文本靠前的那些行排在前面

-- 使用这个例子来演示排序如何工作
select note_text, Match(note_text) Against('rabbit') as rank
from productnotes;

【说明】这个例子与3中的例子不同。
这个例子对productnotes表中每一条记录的note_text字段计算与搜索文本’rabbit’的相关程度,并且生成计算字段且取别名为rank。
这样达到了查看每条记录的note_text与’rabbit’相关程度的目的。

5.使用查询扩展

1)返回行,这些行的指定列包含给定的搜索文本;
2)返回行,这些行的指定列不包含给定的搜索文本,但是与给定的搜索文本有一定的相关性;

-- 全文本查询扩展的实现
select note_text
from productnotes
where Match(note_text) Against('rabbit' WITH QUERY EXPANSION);

【在Against()函数中 -搜索文本- 的后面加上关键字 WITH QUERY EXPANSION】
【扩展查询的过程】
MySQL对数据和索引进行两遍扫描来完成搜索:
1.进行基本的全文本搜索,找出所有与搜索条件匹配的行;
2.MySQL检查这些匹配的行,并选择“所有有用的词”— 这个有用的词不一定包含在“搜索文本”中,但是与“搜索文本”相关性很高;
3.MySQL再次进行全文本扫描,不仅使用原有的“搜索文本”,同时使用第2步得到的“所有有用的词”;
【注意】
1)查询扩展功能与MySQL4.1.1引入,不适用于之前的版本;
2)表中行越多,行中指定字段的文本越多,使用“查询扩展”的效果就越好。

6.布尔文本搜索

【功能】
1)返回包括搜索文本的行;
2)返回不包括搜索文本的行;
3)词重要程度排列提示,指定某些词比其他词更重要,这些词等级更高;
4)表达式分组;
5)另外一些功能。
【注意】
布尔文本搜索在没有定义FULLTEXT的情况下也可以使用;
但是布尔文本搜索是一种非常缓慢的操作;
【在Against()函数中 “搜索文本” 的后面加上关键字 IN BOOLEAN MODE】
简单的例子:

-- 布尔文本搜索的例子 搜索文本中带有rabbit的行
select note_text
from productnotes
where Match(note_text) Against('rabbit' IN BOOLEAN MODE);
-- 布尔文本搜索的例子 搜索文本中带有rabbit 但不包含以rope开头的词的行
-- 这里以rope开头 比如 ropes 就是以rope开头的
select note_text
from productnotes
where Match(note_text) Against('rabbit -rope*' IN BOOLEAN MODE);

【全文本操作符】

布尔操作符说明
+包含,这个词必须存在
-排除,这个词必须不存在
>包含,这个词增加等级值
<包含,这个词减少等级值
()把几个词组成子表达式,允许这些子表达式作为一个组被包含、排除、排列等
~取消一个词的排序值
*词尾的通配符
“”定义一个短语,与单个词的列表不一样,它匹配整个短语,以便包含或排除这个短语

一些例子:

-- 1.搜索匹配包含rabbit 和 bait 两个词的行 两者都必须存在
select note_text
from productnotes
where Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);

-- 2.搜索匹配包含rabbit 和 bait 两个词之一的行 两者包含一个即可
select note_text
from productnotes
where Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);

-- 3.搜索匹配包含"rabbit bait"整个短语的行 完全匹配
select note_text
from productnotes
where Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);

-- 4.搜索匹配 rabbit 和 bait,增加前者的等级,降低后者的等级
select note_text
from productnotes
where Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);

-- 4.搜索匹配 rabbit 和 bait,增加前者的等级,降低后者的等级
select note_text
from productnotes
where Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);

-- 5.搜索匹配词rabbit和bait,降低后者的等级
select note_text
from productnotes
where Match(note_text) Against('+rabbit +(<bait)' IN BOOLEAN MODE);

【注意】在布尔方式中,不按等级值降序排序返回行。

7.全文本搜索的一些总结说明

1)索引全文本数据时,短词(具有3个或3个一下字符的词)被忽略,且从索引中排除,有需要的话,要另外设置;
2)MySQL自带非用词列表stopword(停用词列表),有需要的话,可以覆盖这个列表;
3)【50%规则】许多出现频率很高的词,搜索它们并没有用处,会返回太多的结果;如果一个词在50%的行里出现过,则将被视为非用词(停用词)被忽略;这个规则不用于IN BOOLEAN MODE中;由于这个规则,当行数少于3行的时候,全文本搜索将不返回结果;
4)全文本搜索索引的时候将忽略单引号,如:don’t 索引为 dont;
5)没有词分隔符的语言,如汉语、韩语、日语等不能恰当的返回全文本搜索结果;
6)MySQL的全文本搜索目前还不支持“邻近操作符”:
能在“相同的句子中”或“相同的段落中”或“特定数量的词的范围中”等 搜索相邻的词;
7)再次声明,仅在MyISAM数据库引擎中支持全文本搜索。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页