Elasticsearch系列-倒排索引概念
在日常生活中,我们去购买书籍的时候,都会先去看一下书籍的目录,通过目录我们可以很快找到需要内容所在的位置,然后找到对应位置去详细查看。还有就是我们平常设计表结构的情况,一般我们都会给表设计一个主键id,通过主键id我们就能很方便的找到对应信息。这种通过id去找内容的方法,就是正排索引。那倒排索引其实就是反过来,通过内容或者单词能找到对应id的信息。总结来说,正排索引就是文档id到文档内容和单词的关联。倒排索引就是单词到文档id的关系。
正排索引:
id | name | age | address |
---|---|---|---|
1 | Layne | 27 | China |
2 | Nancy | 28 | China |
3 | Kobe | 41 | USA |
假设我们给name做倒排索引:
term | id | count |
---|---|---|
Layne | 1 | 1 |
Nancy | 2 | 1 |
Kobe | 3 | 1 |
给address做倒排索引:
term | id | count |
---|---|---|
China | 1,2 | 2 |
USA | 3 | 1 |
倒排索引的核心组成
- 单词词典(Term Dictionary):记录所有文档的单词,记录单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+数或哈希拉链法实现,以满足高性能的插入与查询。
- 倒排列表(Posting List):记录了单词对应的文档结合,由倒排索引项组成。
倒排索引项(Posting)包含:- 文档id
- 词频TF 该单词在文档中出现的次数,用于相关性评分
- 位置 单词在文档中分词的位置。用于语句搜索
- 偏移 记录单词的开始结束位置,实现高亮显示
Elasticsearch的倒排索引
Elasticsearch的JSON文档中的每个字段,都有自己的倒排索引。
可以指定对某些字段不做索引。优点:节省存储空间,缺点:字段无法被搜索。