这是篇翻译文,图画的挺有意思。

Elastic使用非常特殊的数据结构,称作反向索引。反向索引中,包括了一组document中出现的唯一的单词,和对应的单词,所出现的位置。反向索引是在ES中,document被创建的同时,创建的。创建的过程称作“分析”。接下来,会说明它是如何被创建以及如何被保存在shard中用来搜索docuemnt

从Document到可被查找的索引

mysql 反向索引 反向索引的含义_mysql 反向索引

Client端发送命令在ELS中创建document。

一旦document在ELS中被创建,它要经历分析阶段。在这阶段中,document被tokenized(整体的东西被拆分成个体)和normalised(正常化)。

对于给定的document,反向索引将被创建,保存在临时的buff之中,直到buffer变满为止。一旦变满,将被冲到segment中。

segment是最小的逻辑单元,shard可以看做是一组segment的集合。segment里全是从buffer过来的反向索引。

一旦segment装满了反向索引,shard就可以被搜索。

 

用于索引和查询的文本分析(反向索引的创建)

分析过程是在shard中,创建索引的核心过程。不仅在创建document时被使用,还会在查询时使用。下图是在索引过程中如何被使用的。

mysql 反向索引 反向索引的含义_mysql 反向索引_02

   假设我们有两条document要被创建

{
    "name" : "Nikhil",
    "id": "zytham",
    "comment" : "The thin lifeguard was swimming in the lake"
    "date" : "2018-02-12"
}
 
{
    "name" : "Ranjan",
    "id": "nranjan",
    "comment" : "Swimmers race with the skinny lifeguard in lake"
    "date" : "2018-02-12"
}

假设我们关心comment部分。我们有两行文本要分析。

1. The thin lifeguard was swimming in the lake
2. Swimmers race with the skinny lifeguard in lake

Tokenisation(分解化):

首先区分单词,创建排序列表。下方1,2表示出现在第几个document中。

Token

Present in Document

Swimmers

2

The

1

in

1,2

lifeguard

1,2

lake

1,2

race

2

skinny

2

swimming

2

the

1,2

thin

1

was

1

with

1

 

 

 

 

 

 

 

 

 

 

Filter:

去除停顿词,如the、in等。

小写化(目的是查询时不区分大小写)

获取词根(swimming to swim)

同义词转换(thin == skinny)

这次都是基于ELS提供的内置的文本分词器。也有对应的中文的分词器。

 

查询document时进行文本分析。

当使用get命令查询document,索引化时会使用同样的分析器。如:查询the thin时,会先去掉the,然后同义词转换,最后查询,返回检索到的document.

mysql 反向索引 反向索引的含义_搜索_03