全文本搜索

全文本搜索

  • 使用全文本(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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容