Elasticsearch倒排索引结构

2021年09月15日 阅读数:2
这篇文章主要向大家介绍Elasticsearch倒排索引结构,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一切设计都是为了提升搜索的性能html

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来说,正向索引是经过key找value,反向索引则是经过value找key。数据库

先来回忆一下咱们是怎么插入一条索引记录的:json

curl -X PUT "localhost:9200/user/_doc/1" -H 'Content-Type: application/json' -d'
{
    "name" : "Jack",
    "gender" : 1,
    "age" : 20
}
'

其实就是直接PUT一个JSON的对象,这个对象有多个字段,在插入这些数据到索引的同时,Elasticsearch还为这些字段创建索引——倒排索引,由于Elasticsearch最核心功能是搜索。数组

那么,倒排索引是个什么样子呢?app

首先,来搞清楚几个概念,为此,举个例子:curl

假设有个user索引,它有四个字段:分别是name,gender,age,address。画出来的话,大概是下面这个样子,跟关系型数据库同样性能

Term(单词):一段文本通过分析器分析之后就会输出一串单词,这一个一个的就叫作Term(直译为:单词)url

Term Dictionary(单词字典):顾名思义,它里面维护的是Term,能够理解为Term的集合spa

Term Index(单词索引):为了更快的找到某个单词,咱们为单词创建索引.net

Posting List(倒排列表):倒排列表记录了出现过某个单词的全部文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,便可获知哪些文档包含某个单词。(PS:实际的倒排列表中并不仅是存了文档ID这么简单,还有一些其它的信息,好比:词频(Term出现的次数)、偏移量(offset)等,能够想象成是Python中的元组,或者Java中的对象)

(PS:若是类比现代汉语词典的话,那么Term就至关于词语,Term Dictionary至关于汉语词典自己,Term Index至关于词典的目录索引)

咱们知道,每一个文档都有一个ID,若是插入的时候没有指定的话,Elasticsearch会自动生成一个,所以ID字段就很少说了

上面的例子,Elasticsearch创建的索引大体以下:

name字段:

age字段:

gender字段:

address字段:

Elasticsearch分别为每一个字段都创建了一个倒排索引。好比,在上面“张三”、“北京市”、22 这些都是Term,而[1,3]就是Posting List。Posting list就是一个数组,存储了全部符合某个Term的文档ID。

只要知道文档ID,就能快速找到文档。但是,要怎样经过咱们给定的关键词快速找到这个Term呢?

固然是建索引了,为Terms创建索引,最好的就是B-Tree索引(PS:MySQL就是B树索引最好的例子)。

首先,让咱们来回忆一下MyISAM存储引擎中的索引是什么样的:

咱们查找Term的过程跟在MyISAM中记录ID的过程大体是同样的

MyISAM中,索引和数据是分开,经过索引能够找到记录的地址,进而能够找到这条记录

在倒排索引中,经过Term索引能够找到Term在Term Dictionary中的位置,进而找到Posting List,有了倒排列表就能够根据ID找到文档了

(PS:能够这样理解,类比MyISAM的话,Term Index至关于索引文件,Term Dictionary至关于数据文件)

(PS:其实,前面咱们分了三步,咱们能够把Term Index和Term Dictionary当作一步,就是找Term。所以,能够这样理解倒排索引:经过单词找到对应的倒排列表,根据倒排列表中的倒排项进而能够找到文档记录)

为了更进一步理解,下面从网上摘了两张图来具现化这一过程:

 

根据单一职责原则,一篇只讲一件事情,关于倒排索引结构就讲到这里,至于更多细节,好比:压缩,存储那些之后再説

 

参考:

https://www.infoq.cn/article/database-timestamp-02?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk

https://www.cnblogs.com/sha0830/p/8000242.html

https://blog.csdn.net/andy_wcl/article/details/81631609

https://cloud.tencent.com/developer/news/329497