Elasticsearch 什么是正向索引?什么是倒排索引?
参考回答
在 Elasticsearch(以及全文检索领域)中,正向索引 和 倒排索引 是两种核心的数据结构,用于存储和搜索文档内容。
1. 正向索引
正向索引 是按文档存储内容的一种索引方式,即记录文档的 ID 和内容的映射关系。
工作原理:
1. 每个文档被存储为一条记录,记录包含文档的唯一标识符(ID)和文档的完整内容。
2. 要查找某个关键词时,需要逐个文档扫描内容,找到包含关键词的文档。
优点:
– 文档的内容完整存储,便于直接读取和处理。
缺点:
– 搜索效率低,需要遍历每个文档,特别是在关键词搜索时,性能较差。
示例:
| 文档 ID | 文档内容 |
|---|---|
| 1 | “Elasticsearch 是搜索引擎” |
| 2 | “Elasticsearch 使用倒排索引” |
- 如果搜索 “倒排索引”,需要扫描所有文档内容,找到包含该词的文档。
2. 倒排索引
倒排索引 是一种为关键词建立索引的存储方式,即记录每个关键词与包含该关键词的文档 ID 的映射关系。
工作原理:
1. 对文档的内容进行分词,将其拆分成关键词(terms)。
2. 为每个关键词创建一个记录,标记出包含该关键词的文档列表。
3. 搜索时直接查找关键词对应的文档列表,效率极高。
优点:
– 搜索效率高,尤其适合全文检索和关键词查询。
– 不需要逐个扫描文档内容,大大减少查询时间。
缺点:
– 不存储文档的完整内容,仅存储关键词到文档的映射,需要配合其他数据结构存储完整内容。
示例:
文档:
– Doc1: “Elasticsearch 是搜索引擎”
– Doc2: “Elasticsearch 使用倒排索引”
倒排索引结构:
| 关键词 | 文档列表 |
|---|---|
| Elasticsearch | Doc1, Doc2 |
| 是 | Doc1 |
| 搜索引擎 | Doc1 |
| 使用 | Doc2 |
| 倒排索引 | Doc2 |
- 搜索 “倒排索引” 时,直接定位到 Doc2。
3. 正向索引与倒排索引的对比
| 特性 | 正向索引 | 倒排索引 |
|---|---|---|
| 存储结构 | 按文档存储内容 | 按关键词存储文档映射 |
| 搜索效率 | 低,需要逐个扫描文档 | 高,直接查找关键词对应的文档列表 |
| 存储需求 | 存储文档的完整内容 | 存储关键词与文档 ID 的映射 |
| 适用场景 | 适合逐个读取文档的场景 | 适合关键词搜索和全文检索的场景 |
4. Elasticsearch 中的应用
- 倒排索引是核心
- Elasticsearch 的全文检索完全基于倒排索引。
- 每个字段都会生成倒排索引,存储关键词到文档的映射。
- 正向索引的补充
- Elasticsearch 使用正向索引存储文档的完整内容(即
_source字段)。 _source用于返回查询结果时获取文档的完整内容,但不参与实际搜索。
- Elasticsearch 使用正向索引存储文档的完整内容(即
5. 示例分析
假设有以下文档:
- Doc1: “Elasticsearch 是一个搜索引擎”
- Doc2: “搜索引擎使用倒排索引”
正向索引存储:
| 文档 ID | 文档内容 |
|---|---|
| Doc1 | “Elasticsearch 是一个搜索引擎” |
| Doc2 | “搜索引擎使用倒排索引” |
倒排索引存储:
| 关键词 | 文档列表 |
|---|---|
| Elasticsearch | Doc1 |
| 是 | Doc1 |
| 一个 | Doc1 |
| 搜索引擎 | Doc1, Doc2 |
| 使用 | Doc2 |
| 倒排索引 | Doc2 |
- 搜索 “搜索引擎”:
- 根据倒排索引直接找到 Doc1 和 Doc2。
- 返回文档内容:
- Elasticsearch 会使用正向索引(
_source)提取完整的文档内容。
- Elasticsearch 会使用正向索引(
6. 总结
- 正向索引:
- 按文档存储内容,适合逐个文档处理,但搜索效率低。
- 倒排索引:
- 按关键词存储文档映射,是 Elasticsearch 的核心,用于高效的全文检索。
在 Elasticsearch 中,正向索引和倒排索引相辅相成:倒排索引用于高效搜索,正向索引用于返回完整的文档内容,从而实现高性能的全文检索引擎。