倒排索引(Inverted Index)
**倒排索引(Inverted Index)**是一种用于快速查找文档中包含特定词的数据结构,广泛应用于全文搜索引擎(如Elasticsearch、Lucene等)和数据库的全文索引中。与传统的正排索引(从文档到词的映射)不同,倒排索引是从词到文档的映射。
倒排索引的核心结构
倒排索引由两部分组成:
1、词典(Term Dictionary):
存储所有唯一的词
通常使用高效的数据结构(如哈希表、B-Tree、Trie树)来快速查找词
2、倒排列表(Posting List):
对于每个词,存储包含该词的文档ID列表(DocumentID List)。
倒排列表通常还会存储额外的信息,如词频(Term Frequency)、位置信息(Position)等。
倒排索引的示例
假设有以下文档集合:
-
文档1:
"I love programming"
-
文档2:
"Programming is fun"
-
文档3:
"I love coding"
1. 分词
首先对文档进行分词,得到以下词项:
-
文档1:
["I", "love", "programming"]
-
文档2:
["Programming", "is", "fun"]
-
文档3:
["I", "love", "coding"]
2. 构建倒排索引
倒排索引的结构如下:
词(Term) | 倒排列表(Posting List) |
---|---|
I | [文档1, 文档3] |
love | [文档1, 文档3] |
programming | [文档1, 文档2] |
is | [文档2] |
fun | [文档2] |
coding | [文档3] |
3. 倒排列表的详细信息
在实际应用中,倒排列表可能包含更多信息,例如:
-
文档ID(Document ID):标识包含该词的文档。
-
词频(Term Frequency):该词在文档中出现的次数。
-
位置信息(Position):该词在文档中出现的位置(用于短语查询)。
例如,对于词"programming"
,倒排列表可能如下:
-
文档1:词频=1,位置=[2]
-
文档2:词频=1,位置=[0]
倒排索引的查询过程
以查询词"love"
为例:
-
在词典中查找
"love"
。 -
找到对应的倒排列表
[文档1, 文档3]
。 -
返回文档1和文档3作为查询结果。
倒排索引的优化
为了提高倒排索引的查询效率和存储效率,通常会采用以下优化技术:
1. 词典优化
-
哈希表:快速查找词。
-
B-Tree:支持范围查询。
-
Trie树:支持前缀匹配。
2. 倒排列表压缩
-
差值编码(Delta Encoding):存储文档ID的差值而非原始值。
-
位图压缩(Bitmap Compression):使用位图表示文档ID列表。
3. 分布式存储
- 在大规模文档集合中,倒排索引可以分布到多个节点上,以提高查询性能和存储容量。