Elasticsearch 与传统关系型数据库的对比、倒排索引原理解析

101 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Elasticsearch 和 传统关系型数据库的对比

  1. Elasticsearch中的概念与关系型数据库对比
Relational DBDatabasesTablesRowsColumns
关系型数据库数据库
ElasticsearchIndicesTypesDocumentsFields
搜索引擎索引类型文档域(字段)
  1. 在Elasticsearch中,所有的字段缺省都建了索引。 也就是说每一个字段都有一个倒排索引,用于快速查询。
  2. es支持http协议(json格式)(9200端口)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成),传统关系型数据库不支持。
  3. es支持分片和复制,从而方便水平分割和扩展,复制保证了es的高可用与高吞吐。

索引不可变原因

倒排索引包含:

  • 文档的列表
  • 文档的数量
  • 词条在每个文档中出现的次数
  • 出现的位置
  • 每个文档的长度
  • 所有文档的平均长度

索引不可变的原因:

  • 不需要锁,提升并发性能
  • 可以一直保存在缓存中
  • 节省cpu和io开销

倒排索引

Elasticsearch使用一种称为倒排索引的结构,她适用于快速的全文搜索。 一个倒排索引由文档中所有不能重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

示例:

  1. 假设文档集合包含五个文档,每个文档内容表所示,表的最左端一栏是每个文档对应的文档编号,我们的任务就是对这个文档集合建立倒排索引。

    文档编号文档内容
    1谷歌地图之父跳槽Facebook
    2谷歌地图之父加盟Facebook
    3谷歌地图创始人拉斯离开谷歌加盟Facebook
    4谷歌地图之父跳槽Facebook与Wave项目取消有关
    5谷歌地图之父拉斯加盟社交网站facebook
  2. 中文和英文等语言不同、单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引。“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排索引。

    单词ID单词倒排索引(DocID)
    1谷歌1,2,3,4,5
    2地图1,2,3,4,5
    3之父1,2,4,5
    4跳槽1,4
    5Facebook1,2,3,4,5
    6加盟2,3,5
    7创始人3
    8拉斯3,5
    9离开3
    104
    11Wave4
    12项目4
    13取消4
    14有关4
    15社交5
    16网站5
  3. 索引系统还可以记录除此之外的更多信息,下表还记录了单词频率信息(TF)即这个单词在某个文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。

    单词ID单词倒排索引(DocID:TF)
    1谷歌(1:1),(2:1),(3:2),(4:1),(5:1)
    2地图(1:1),(2:1),(3:1),(4:1),(5:1)
    3之父(1:1),(2:1),(4:1),(5:1)
    4跳槽(1:1),(4:1)
    5Facebook(1:1),(2:1),(3:1),(4:1),(5:1)
    6加盟(2:1),(3:1),(5:1)
    7创始人(3:1)
    8拉斯(3:1),(5:1)
    9离开(3:1)
    10(4:1)
    11Wave(4:1)
    12项目(4:1)
    13取消(4:1)
    14有关(4:1)
    15社交(5:1)
    16网站(5:1)
  4. 倒排列表中还可以记录单词在某个文档出现的位置信息(1,<11>,1),(2,<7>,1),(3,<3,9>,2)有了这个索引系统,搜索引擎可以很方便地相应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息既可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程。

示例:

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

倒排索引(x代表存在于的文档中)

TermDoc_1Doc_2
Quickx
Thex
brownxx
dogx
dogsx
foxx
foxesx
inx
jumpedx
lazyxx
leapx
overxx
quickx
summerx
thex
  1. 搜索quick brown(计算相关度分数时,文档1的匹配度高,分数会比文档2高):
TermDoc_1Doc_2
brownxx
quickx
Total21
  1. 标准化规则(normalization): Quick 和 quick 以独立的词条出现,然后用户可能认为它们是相同的词。 fox 和 foxes 非常相似,就像 dog 和 dogs,它们由相同的词根。 jumped 和 leap ,尽管没有相同的词根,但是它们的意思很相近,是同义词。 搜索含有 Quick fox的文档是搜不到的。 使用标准规划规则,建立倒排索引的时候,会对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率。
TermDoc_1Doc_2
brownxx
dogxx
foxxx
inx
jumpxx
lazyxx
overxx
quickxx
summerx
thexx