Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。
我们把正排索引看作是书的目录,那倒排索引就是类似词典中单词的索引页,告诉你它在第几页:
- 书籍
- 正排索引 - 目录页
- 倒排索引 - 索引页
- 搜索引擎
- 正排索引 - 文档id到文档内容和单词的关联
- 倒排索引 - 单词到文档id的关系
正排索引:
文档Id | 文档内容 |
---|---|
1 | blue yellow |
2 | yellow green |
3 | yellow red |
倒排索引:
Term | Count | DocumentId:Postition |
---|---|---|
yellow | 3 | 1:1,2:0,3:0 |
blue | 1 | 1:0 |
green | 1 | 2:1 |
red | 1 | 3:1 |
倒排索引的组成
- 单词词典
记录所有文档的单词,记录到此到倒排列表的关联关系
ps: 单词词典一般很大,通过b+或者哈希拉链法实现,满足其高性能的插入与查询 - 倒排列表
记录了单词对应的文档结合,由倒排索引项组成:- 文档id
- 词频 - 该词在文档中出现的次数,用于相关性评分
- 位置 - 文档中分词的位置。 用于语句搜索
- 偏移 - 记录单词的开始结束位置,实现高亮显示
Demo:Elasticsearch
文档Id | 文档内容 |
---|---|
1 | Mastering Elasticsearch |
2 | Elasticsearch Server |
3 | Elasticsearch Essentials |
Doc Id | TF | Position | Offset |
---|---|---|---|
1 | 1 | 1 | <10,23> |
2 | 1 | 0 | <0,13> |
3 | 1 | 0 | <0,13> |
ES的倒排索引
-
ES的json文档中的每个字段,都有自己的倒排索引
-
可以指定对某些字段不做索引
优点: 节省存储空间 缺点: 字段无法被搜索
网友评论