ElasticSearch的倒排索引和分析器

概念

ElasticSearch使用一种称之为 倒排索引 的数据结构,实现快速的全文索引。
一个倒排索引由 文档中所有不重复的词 + 包含对应的词的文档列表 组成。

倒排索引举例

比如有两个文档,有如下内容:

1. The quick brown fox jumped over the lazy dog
2. Quick brown foxes leap over lazy dogs in summer

为了创建倒排索引,
第一步工作 —— 分词(分出来的单独的词,我们称之为“词条”或“token”);
第二部工作 —— 创建一个包含不重复词条的排序列表,并列出该词条出现在哪个文档。结果如下所示:

Term      Doc_1  Doc_2
-------------------------
Quick   |       |  X
The     |   X   |
brown   |   X   |  X
dog     |   X   |
dogs    |       |  X
fox     |   X   |
foxes   |       |  X
in      |       |  X
jumped  |   X   |
lazy    |   X   |  X
leap    |       |  X
over    |   X   |  X
quick   |   X   |
summer  |       |  X
the     |   X   |
------------------------

这就是乞丐版本的倒排索引。
如果我们想搜索quick brown,我们只需要查找包含各个词条的文档:

Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
quick   |   X   |
------------------------
Total   |   2   |  1

两个文档都匹配,但是第一个文档比第二个的匹配度更高,如果我们使用 仅计算匹配词条数量简单相似性算法,我们可以说,查询的相关性第一个文档比第二个文档更佳。
但是当前的倒排索引有一些问题:

  • Quick和quick以独立的词条出现,然而用于认为它们是同一个词;
  • fox和foxs相似,它们有相同的词根;
  • jumped和leap虽然没有相同的词根,但是它们的意思相近,是同义词。

所以:
使用我们乞丐版的倒排索引搜索+Quick +fox不会得到任何文档(+前缀表示这个词必须存在)。但是用户觉得,第一个文档包含quick fox,第二个文档包含Quick foxes。这两个文档都满足的需求。为了满足常规需求,我们必须优化乞丐版倒排索引,如:

  • 将索引Term全部转为小写;
  • 复数单词只提取词根作为Term。如foxes只提取fox;
  • jump和leap是同义词,可只索引jump。
Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
dog     |   X   |  X
fox     |   X   |  X
in      |       |  X
jump    |   X   |  X
lazy    |   X   |  X
over    |   X   |  X
quick   |   X   |  X
summer  |       |  X
the     |   X   |  X
------------------------

此时我们搜索+Quick +fox还是会失败,因为索引中已经没有Quick了。所以我们还得对搜索条件做同样的标准化处理,才能匹配到两个文档。

分词和标准化的过程称之为分析

分析和分析器

分析包含如下过程:

  • 首先,将文本切分成适合于倒排索引的独立的词条(分词);
  • 之后,将词条统一化为标准格式以提高可搜索性,或者recall

分析器实际上是将三个功能封装到了一个包里:

  1. 字符过滤器
    字符串按顺序通过层层 字符过滤器。他们的任务是在分词前整理字符串,字符过滤器的作用如 去掉HTML,将&转化为and等。
  2. 分词器
    过滤后的字符串被分词器分为单个的词条。
    一个简单的分词器遇到空格或者标点可能会将文本拆成词条。
  3. Token过滤器
    词条按顺序通过每个Token过滤器,这个过程可能会改变词条(小写化Quick),删除词条(“a”,‘’an",“the”之类的无用词),增加词条(jumped和leap这种同义词)。

ElasticSearch提供了开箱可用的预包装分析器。

ElasticSearch内置分析器

"Set the shape to semi-transparent by calling set_trans(5)"

标准分析器

ElasticSearch默认使用的分析器。分析各种语言文本最常用的选择。它根据Unicode联盟定义的 单词边界划分文本,删除绝大多数标点,最后将词条小写。

set, the, shape, to, semi, transparent, by, calling, set_trans, 5

简单分析器

简单分析器在任何不是字母的地方分割文本,将词条小写。

set, the, shape, to, semi, transparent, by, calling, set, trans

空格分析器

在空格的地方分割文本。

Set, the, shape, to, semi-transparent, by, calling, set_trans(5)

语言分析器

特定语言分析器可以分析很多语言(https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-lang-analyzer.html),他们可以考虑制定语言的特点(如英语分析器附带了一组无用词过滤器,过滤a,the等)

set, shape, semi, transpar, call, set_tran, 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值