Elasticsearch–倒排索引
什么是倒排索引?
例如,mysql中有数据表user,表中含有两个字段,主键userId,和姓名userName。
userId | userName |
1000 | 小明 |
1001 | 小强 |
由于userId是主键,在数据量巨大的情况下我们可以通过主键索引快速的找到某一个userId下的userName。反之想要通过userName反查userId就会变得非常的慢,因为userName字段没有索引,查询的效率会大大的降低,但是,很多实际应用场景下通过用户名反查一个用户信息的操作是非常常见的。由于这些实际的需求,倒排索引应运而生。
现在来举例说明下倒排索引:
假设有两篇文章:
文章1:Tom lives in GuangZhou, Jack lives in GuangZhou too
文章2:He lives in ShangHai
取得关键词:
文章1:Tom lives GuangZhou Jack lives GuangZhou
文章2:He lives ShangHai(in,too等词无意义,类似于的,也。选择性过滤)
有了上面的关键词,我们根据关键词来创建索引
关键词 | 文章号 |
Tom | 1 |
lives | 1,2 |
GuangZhou | 1 |
Jack | 1 |
He | 2 |
ShangHai | 2 |
文章1和文章2经过倒排后的对应关系就如上图所示。但是,仅仅知道关键词出现在哪些文章中还不够,我们还需要知道关键词在文章中出现的位置和频率。位置的表示方法通常有两种,一种是记录字符的位置,另一种是记录关键词的位置。Elasticsearch选取的是后者,记录关键词出现的位置。经过整理如下表:
关键词 | 文章号[频率] | 位置 |
Tom | 1[1] | 1 |
lives |
1[2] 2[1] |
2,5 2 |
GuangZhou | 1[2] | 3,6 |
Jack | 1[2] | 4 |
He | 2[1] | 1 |
ShangHai | 2[1] | 3 |
这样就形成了以关键词作为索引的倒排索引列表,可以通过关键词快速的查找文章等信息。这是实现全文搜索最重要的一步。