mysql全文本搜索

来源:互联网 发布:b2b推广软件 编辑:程序博客网 时间:2024/05/04 15:33
      MyISAM支持全文本搜索,InnoDB不支持
      通配符与正则表达式匹配的性能较低,通常会匹配表的所有行,而且这些搜索极少使用索引,且返回的结果不智能化。在使用全文本搜索时,mysql不需要分别查看每个行,不需要分析和处理每个词。
      为了进行全文本搜索,必须在被搜索的列建立索引,在建立索引后,使用match()与against()完成搜索,match指定被搜索的列,against指定要使用的搜索表达式。传递给match()的值必须与fulltext()定义中的相同,如果指定多个列,则必须列出他们,次序也需正确。
      启用全文本搜索可以在建立表时指定,FULLTEXT(note_text),指定对该列进行索引,如果需要也可以指定多个列。如果正在导入数据到一个新表,不应该开启fulltext索引,应该先导入所有数据,然后再修改表,定义fulltext,这样有助于更快导入数据,因为如果建表时指定,mysql会自动维护索引,在增加、更新或删除行时,索引也会随之更新,会花费时间。
      全文本搜索会对结果排序,具有较高等级的行先返回,以文本匹配的良好程度排序数据。如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词的那些行高的等级值。全文搜索有的功能可以用LIKE实现,但是全文搜索提供了LIKE不能提供的功能(结果自动排序),而且由于数据是索引的,全文本所有还相当快。
     如select note_text, match(note_text) against ('rabbit') as rank from productnotes;在select中使用match与against,会返回所有行,并使用match,against建立一个计算列,包含全文本搜索机算出的等级值。
      查询扩展(with query expansion)不止返回包含搜索词的行,还返回与该行相关的行。mysql使用两遍扫描来完成搜索:
      首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;
      其次,mysql检查这些匹配行并选择所有有用的词,
      最后,mysql再进行全文本搜索,不仅仅使用原条件,还使用所有有用的词。
      利用扩展查询,能找出可能相关的结果,即使他们并不精确包含所查找的词。行越多,返回的结果越好。
select note_text from productnotes where match(note_text) against('anvils' with query expansion) ;

     布尔文本搜索,(in boolean mode),即使没有fulltext索引也可以使用。但是比较缓慢。如匹配包含heavy但不好喊任意以rope开始的词的行:SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE)
    布尔搜索可以指定以下搜索条件:
   1 要匹配的词   2 要排斥的词(包含该词的行不返回,即使包含指定的词)3 排列提示(词的重要等级)4表达式分组
   文本布尔操作符:
  布尔操作符
说明
+
包含,词必须存在
-
排除,词必须不出现
>
包含,而且增加等级值
<
包含,而且降低等级值
()
把词组成子表达式(允许这些子表达式作为一个组被包含,排序,排列等)
~
取消一个词的排序值
*
词尾的通配符
""
定义一个短语,匹配整个短语

   全文本搜索的使用说明:
   1 在索引全文本数据时,短词被忽略且从索引中排除。短词定义为具有3个或3个以下字符的词(可以更改)
   2 mysql带有一个内建的非用词表,这些词在全文本搜索中被忽略,
   3 mysql规定了一条50%规则,如果一个词出现在50%以上的行中,则将它忽略,不使用与in boolean mode
   4 如果表中的行少于3行,全文本搜索不返回结果(因为每次词或者不出现,或者至少50%出现)
   5 忽略词中的个单引号

SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit  +bait' IN BOOLEAN MODE);  //匹配包含词rabbit和bait的行。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit  bait' IN BOOLEAN MODE);   //匹配包含词rabbit和bai至少一个词t的行。
SELECT note_text FROM productnotes WHERE Match(note_text) Against(' "rabbit bait" ' IN BOOLEAN MODE);   //匹配包含短语“rabbit bait”的行。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('>rabbit  <carrot' IN BOOLEAN MODE);   //匹配包含词rabbit和carrot的行,增加rabbit的等级,降低carrot的等级
SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit  +(<combination)' IN BOOLEAN MODE);   
//匹配包含词rabbit和combination的行,降低combination等级。
0 0
原创粉丝点击