产品级搜索技术-全文本索引

介绍

大部分技术员在处理搜索问题的时候,往往直接依赖数据库的查询功能,通过普通 SQL 语句的数值比较, 范围的过滤等就可以完成绝大多数我们需要的查询了, 但是如果你希望通过关键字的匹配来进行查询过滤, 那么就需要基于相似度的查询, 而不是原来的精确数值比较, 那么这种查询我们第一个想到的肯定是 LIKE 的 SQL 语句, 但是 LIKE 模糊查询它的工作原理是全表扫描, 如果数据量非常大, 那么会造成非常严重的卡顿, 也可能出现整个项目崩掉, 而全文索引的设计就是避免这种情况的发生

全文搜索分类

  1. 自然语言搜索(默认类型):MySQL 会把搜索的字符串解析成一系列的单词,然后去搜索包含的行;
  2. 布尔模式搜索:可以为搜索的字符串里加修饰词,或者必须是什么短语,安顺序搜索等
  3. 查询扩展搜索:这种搜索分为两个阶段。第一阶段,是自然语言搜素。第二阶段,则先把原来的搜索字符串,与第一阶段的搜索里高度匹配的那些行,连接到一起。

全文搜索的特性

  1. 全文搜索基于 FullText 索引。在 FullText 索引, 里只能出现在 CHAR VARCHAR TEXT 这几种类型里
  2. 全文搜索会 忽略那些常见词:常见词,指的是至少一半的行里都出现过,超过 50% 的词,都为常见词;
  3. 有些为内建的常用单词:也叫停用词,比如:the after other
  4. 比较短的单词也会被停用

所谓的中文全文索引,就是用一本字典,把一段中文字,拆分为一个个的词语,这样来符合 FullText 的单词定义。然后完全可以把中文看作成英文,进行全文本索引。

建表语句

  1. 创建表,不一定要主键索引
    create table apothegm(
      attribution varchar(40),
      phrase  text
    ) engine = myisan;
  2. 增加全文索引
    alert table apothegm
     add fulltext (phrase),
     add fulltext (attribution),
     add fulltext (phrase,attribution);

个人理解:
1. 索引分为,单列索引和复合索引。
2. 每次在进行搜索的时候,必须要有一个 FullText 索引,而它正好是由查询命令里列出的那些字段组成。
3. 索引越多,写入数据越慢,但是索引的方式也就越多,越加便捷。

自然语言索引

基本 SQL 语句

// 应用其第一个 FullText 索引
select * from apothegm where match(phrase) againts('time');
// 应用其第三个 FullText 索引
select * from apothegm where match(phrase,attribution) againts('time');

输出相关程度 : 自然语言类型的全文搜索。其输出是按照相关程度递减顺序排列,相关度是一个非负数的浮点数,其中 0代表毫不相关

// 把匹配的结构,当作一个独立字段,其中 relavance 为相关程度的意思
select phrase,match(phrase) against('time') as relavance from apothegm
  1. 多个词一起查询,比如查询 hard 或者 soft
select * from apothegm where match(phrase) against('hard soft');

布尔模式的全文索引

特点

  1. 50% 一样的规则:不生效了
  2. 查询结果不再按照 相关程度排序
  3. 也可以对非 FullText 索引列进行搜索,只是速度相比,有 FullText 的速度要慢

使用的方式

  1. 基本方式:要在 MATCH 后面加IN BOOLEAN MODE,(不加说明,默认使用自然排序IN NATURAL LANGUAGE MODE

    select * from apothegm where match(phrase) againts('hard' in boolean mode);
  2. 按单词出现顺序检索,把对应单词用双引号引起来;

    select * from apothegm where match(phrase) againts('“bell book and candle”' in boolean mode);
  3. 可以搜索必须出现,必须不出现,分别用 + 和 -标示:

    select * from apothegm where match(phrase) againts('+bell  -candle' in boolean mode);
  4. 可以用*作为通配符, 标示以什么开头的。但是还是必须遵守,单词不能过短的约定。

配置全文搜索引擎

全文索引的参数是可以配置的,可以通过系统变量的办法进行修改。

  1. 变量 ft_min_word_lenft_max_word_len 来设置单词所具有的最小长度,和最大长度。默认最小值与最大值分别为 4 和 84

  2. my.confmysqld 下添加 下面语句,然后重启。

    ft_min_word_len = 1
  3. 如果是已经建立 FullText 索引表,必须重新建立这些索引关系,但也是可以快速修复。

    repair table tbl_name quick; 
  4. 如果是在此之后新建的 FullText 索引,都可以更新使用这个值。

PS

感谢关注「GitHub 热门」公众号,带你了解技术圈内热门新鲜事!

file

本作品采用《CC 协议》,转载必须注明作者和本文链接
感谢关注「GitHub 热门」公众号
Destiny
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

这个只支持myisam引擎

7年前 评论
Destiny

@lovecn 在mysql 5.7 后innoDB也支持了

7年前 评论

In MySQL 5.6 and up, they can also be used with InnoDB tables.

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!