Elasticsearch架构篇 - 倒排索引与列式存储

倒排索引

倒排索引参考 Elasticsearch官方文档

Elasticsearch 使用一种倒排索引的结构,适用于快速的全文搜索。一个倒排索引会包含文档中所有不重复词项组成的列表以及列出每个词项出现在哪个文档中。

例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

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

为了创建倒排索引,首先将每个文档的 content 域拆分成单独的词项,创建一个包含所有不重复词项组成的排序列表,然后列出每个词项出现在哪个文档中。

结果如下:

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

从结果中可以看出两个文档都匹配,如果采取只计算匹配词项数量的简单相似性算法,则第一个文档比第二个文档匹配度更高。

列式存储

列式存储参考 Elasticsearch官方文档

在这里插入图片描述

在 Elasticsearch 中,Doc Values 就是一种列式存储结构,默认情况下每个字段的 Doc Values 都是激活的,Doc Values 是在索引时创建的,当字段索引时,Elasticsearch 为了能够快速检索,会把字段的值加入倒排索引中,同时它也会存储该字段的 Doc Values

Elasticsearch 中的 Doc Values 常被应用到以下场景:

  • 对一个字段进行排序
  • 对一个字段进行聚合
  • 某些过滤,比如地理位置过滤
  • 某些与字段相关的脚本计算

Elasticsearch 的列式存储中按照文档写入的顺序(没有按照 doc_id 的顺序)进行存储。

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/129393021