正排索引和倒排索引
在讲倒排索引前,先了解下什么是正排索引。在搜索引擎中每个文件对应一个文档 ID ,是文档 ID 到文档内容和单词的关联。
文档 ID | 文档内容 |
---|---|
1 | Mastering ElasticSearch |
2 | ElasticSearch Server |
3 | ElasticSearch Essentials |
而倒排索引是单词到文档 ID 的关系
Term | Count | DocumentId: Position |
---|---|---|
ElasticSearch | 3 | 1:1,2:0,3:0 |
Mastering | 1 | 1:0 |
Server | 2 | 2:1 |
Essentials | 3 | 1:0 |
上面这个倒排索引记录每个词出现的次数,以及出现在文档的位置。
倒排索引的核心组成
倒排索引包含二个部分:
- 单词词典(Term Dictionary),记录了所有的文档的单词,记录单词到倒排列表的关联关系。
- 一般来说,单词词典一般来讲比较大,可以使用 B + 树或哈希拉链法实现,以满足高性能的插入和查询。
- 倒排列表(Position List),记录了单词对应文档的集合,由倒排索引项组成。
- 倒排索引项
- 文档 ID
- 词频 TF,该单词在文档中出现在次数,用于相关性打分
- 位置 Position,单词在文档中出现的位置,用于语句搜索(phrase query)
- 偏移,记录单词的起始位置,实现高亮显示。
- 倒排索引项
对于下面这个文档列表:
文档 ID | 文档内容 |
---|---|
1 | Mastering ElasticSearch |
2 | ElasticSearch Server |
3 | ElasticSearch Essentials |
对 ElasticSearch 这个词的倒排列表(Position List)是:
Doc ID | TF | Position | Offset |
---|---|---|---|
1 | 1 | 1 | <10:23> |
2 | 1 | 0 | <0,13> |
3 | 1 | 0 | <0,13> |
ES 中的倒排索引
对于 ES 中 JSON 文档中的每一个字段,都有自己的倒排索引。
当然,也可以对某些字段不做索引。其优点是节省存储空间、缺点是无法被搜索。