美文网首页
全文本搜索

全文本搜索

作者: olivia_ong | 来源:发表于2016-11-15 21:14 被阅读0次

    全文本搜索

    • 使用全文本(fulltext)搜索,MySQL不需要分别查看每个行,不需要分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行,提高搜索效率。
    • 不是所有引擎都支持全文本搜索,常用的搜索引擎中MyISAM支持全文本搜索,InnoDB不支持。

    使用全文本搜索

    • 在创建表时启用全文本搜索:
    create table table_name
    (
    ...
    fulltext(column_name)//指定列,可以是多个列
    )
    
    • 进行全文本搜索
    select note_text
    from productnotes
    where match(note_text) against('rabbit');
    

    传递给match()的值必须与FULLTEXT中的值相同,如果为多个列,则必须列出它们并且按照定义的顺序
    可以根据等级对结果排序

    select note_text,
           match(note_text) against('rabbit') as rank
    from productnotes;
    

    查询扩展

    放宽所返回的全文本结果的范围

    • 搜索原理
      1.先进行一遍基本的全文本搜索,找出与条件匹配的行;
      2.MySQL检查这些行并选择所有有用的词;
      3.在进行一次全文本搜索,不仅使用原来的条件还是用所有找出的有用的词
    • 举个例子
    select note_text
    from productnotes
    where match(note_text) against('anvils' with query expansion);
    

    布尔文本搜索

    • 布尔方式的搜索可以在条件定义
      要匹配的词
      要排斥的词
      排列提示(提示某些词比较重要)
      表达式分组
      其他
    • 布尔文本搜索条件中的操作符
      +:包含,词必须出现
      -:排斥,词必须不出现
      ‘>’:包含,并且增加等级
      <:包含,并且减少等级
      ():将词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
      ~:取消一个词的排序值
      *:词尾的通配符
      " ":定义一个短语(匹配时匹配整个短语)
    • 举例说明
      包含heavy并且不包含任何一rope开头的词
    select note_text
    from productnotes
    where match(note_text) against('heavy -rope*' in boolean mode);
    

    包含rabbit和bait中至少一个词

    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);
    

    搜索safe和combination,降低后者的等级

    select note_text
    from productnotes
    where match(note_text) against('+safe +(<combination)' in boolean mode);
    

    相关文章

      网友评论

          本文标题:全文本搜索

          本文链接:https://www.haomeiwen.com/subject/jldlpttx.html