天天看点

全文本搜索

并非所有引擎都支持全文本搜索。常使用的搜索引擎包括MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。

优势:

使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以快速有效决定哪些词匹配,哪些不匹配,他们的匹配频率等等。

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在索引之后,select可以与match()和against()一起使用以实际执行搜索。

启动全文本搜索支持

一般在创建爱你表时启用全文本搜索。create table 语句接收 full text 子句。

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 索引单个列,如果需要也可以指定多个列。

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

可以创建表时指定fulltext,或者再稍后指定(但这种情况下所有已有数据唏嘘立即索引)。

不要在导入数据时使用fulltext,应该先导入所有数据,然后再修改表,定义fulltext。这样有助于更快的导入数据。
   
           

进行全文本搜索

match()—指定被搜索的列

against()— 指定要使用的搜索表达式

selectnote_text
from productnotes
where match(note_text) against('rabbit');


分析:针对note_text列进行搜索,指定rabbit作为搜索文本
           
注意
  • 使用完成的match()说明:传递给match()的值必须与fulltext()定义中的相同。如果指定多列,则必须列出他们并且次序正确。
  • 搜索不区分大小写 :除非使用BINARY方式,否则全文本搜索不区分大小写。
  • 使用全文本搜索返回以文本匹配的良好程度排序的数据(行等级)

    等级由根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数据计算出来

使用查询扩展

WITH QUERY EXPANSION

用来设法放款所返回的全文本搜索结果的范围,查找出可能相关的结果,即使它们并不精确包含所查找的词。

使用功能查询扩展MySQL对数据进行两遍扫描完成搜索:

  • 首先进行基本的全文搜索,找出与搜索条件匹配的所有行;
  • 其次,MySQL检查这些匹配行并选择所有有用的词;
  • 最后MySQL再进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词;
select note_text
from productnotes
where match(note_text) against('anvils' WITH QUERY EXPANSION);
           

布尔文本搜索

IN BOOLEAN MODE

  • 要匹配的词;
  • 要排斥的词(如果某行包含这个词,则不反悔该行,即使它包含了其他指定的词也是如此);
  • 排列提示(指定某些词比其他词更重要,更重要的词等级更高);
  • 表达式分组;
  • 另外一些内容;
注意

即使没有定义fulltext索引也可以使用布尔文本搜索,但这是一种非常缓慢的操作(其性能将随着数据量增加而降低)

select note_text
from productnotes
(1)where match(note_text) against('heavy -rope*' IN BOOLEAN MODE);              #有heavy并且排除以rope开始的词
(2)where match(note_text) against('+rabbit +bait' IN BOOLEAN MODE);             #搜索包含词rabbit和bait的行
(3)where match(note_text) against('rabbit bait' IN BOOLEAN MODE);               #搜索包含词rabbit或bait至少一个词的行; 
(4)where match(note_text) against('“rabbit bait”' IN BOOLEAN MODE);             #搜索匹配短语rabbit bait,而不是单个词
(5)where match(note_text) against('>rabbit <carrot' IN BOOLEAN MODE);           #搜索匹配rabbit 和 carrot,增加前者等级,降低后者等级
(4)where match(note_text) against('+safe +(comnination)' IN BOOLEAN MODE);      #搜索匹配短语safe和combination,降低后者等级


           

继续阅读