【Elasticsearch专栏 02】深入探索:Elasticsearch为什么使用倒排索引而不是正排索引

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 倒排索引在搜索引擎中更受欢迎,因为它直接关联文档内容,支持全文搜索和模糊搜索,提高查询效率。其紧凑的结构减少了存储空间,并方便支持多种查询操作。相比之下,正排索引在搜索效率、存储和灵活性方面存在局限。

为什么使用倒排索引而不是正排索引?

Elasticsearch选择使用倒排索引而不是正排索引,主要是基于倒排索引在处理全文搜索和大规模数据集时的优势。下面将详细解释为什么Elasticsearch更倾向于使用倒排索引,并提供一些简化的代码片段来说明这两种索引结构的基本差异。

1.正排索引(Forward Index)

正排索引是一种将文档映射到其包含的单词的索引结构。每个文档都有一个与之关联的单词列表,列表中的单词按照在文档中出现的顺序进行排列。正排索引可以快速找到文档中包含的单词,但对于查找包含特定单词的所有文档则不是很高效。

例如,假设有两个文档:

Document 1: "The quick brown fox jumps over the lazy dog"  
Document 2: "Quick foxes jump over lazy dogs in summer"

一个简化的正排索引可能如下所示:

Document 1 -> [the, quick, brown, fox, jumps, over, the, lazy, dog]  
Document 2 -> [quick, foxes, jump, over, lazy, dogs, in, summer]

如果想要查找包含单词"quick"的所有文档,需要遍历整个索引,检查每个文档的单词列表,这在大规模数据集中是非常低效的。

2.倒排索引(Inverted Index)

倒排索引是一种将单词映射到包含该单词的文档的索引结构。每个单词都有一个与之关联的文档列表,列表中的文档按照某种排序标准(如相关性分数)进行排列。倒排索引可以高效地找到包含特定单词的所有文档,并支持复杂的查询操作,如短语查询、通配符查询和布尔查询等。

对于上面的文档示例,一个简化的倒排索引可能如下所示:

the    -> [Document 1]  
quick  -> [Document 1, Document 2]  
brown  -> [Document 1]  
fox    -> [Document 1]  
jumps  -> [Document 1]  
over   -> [Document 1, Document 2]  
lazy   -> [Document 1, Document 2]  
dog    -> [Document 1]  
foxes  -> [Document 2]  
jump   -> [Document 2]  
dogs   -> [Document 2]  
in     -> [Document 2]  
summer -> [Document 2]

现在,如果想要查找包含单词"quick"的所有文档,只需要查找与"quick"关联的文档列表即可,这是一个非常高效的操作。

3.小结

Elasticsearch选择使用倒排索引而不是正排索引,主要是基于倒排索引在处理搜索查询时的优势。

正排索引是一种基于文档的索引结构,它将文档中的每个词汇作为关键词进行排序和存储。当查询请求到来时,Elasticsearch会根据查询中的词汇在文档中的出现频率和位置信息,对文档进行排序和匹配。这种索引结构适用于全文搜索和基于关键词的搜索,因为它能够快速定位到包含查询关键词的文档。

然而,正排索引在处理基于短语或句子的搜索时可能效果不佳,因为它无法有效地将多个相关的词汇组合在一起进行匹配。此外,随着索引值的增大,一个节点能存储的数据量会大大减少,导致B+树(一种常见的正排索引结构)变得更深,每次查询数据所需的IO次数也会增多,从而影响查询效率。

相比之下,倒排索引是一种基于词汇的索引结构,它将文档中的词汇作为索引项进行存储,并将每个词汇与其对应的文档集合进行关联。当查询请求到来时,Elasticsearch会根据查询中的词汇在倒排索引中查找与之匹配的文档集合,并进行排序和匹配。这种索引结构能够更好地处理基于短语或句子的搜索需求,因为它能够将与查询相关的多个词汇组合在一起进行匹配,从而提高了搜索的准确性和性能。

此外,倒排索引还通过使用分词器对文本进行分词,将文本切分成更小的词汇单元,并构建词汇到文档的映射关系。这种处理方式使得Elasticsearch能够更灵活地处理各种文本数据,并支持更复杂的查询操作。

因此,综合考虑倒排索引在处理搜索查询时的优势和正排索引的局限性,Elasticsearch选择使用倒排索引作为其主要的索引结构。同时,在实际应用中,Elasticsearch也会结合使用正排索引等其他索引结构,以提高搜索性能和准确性。

相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
17天前
|
API 网络架构 索引
Elasticsearch索引中数据的增删改查与并发控制
Elasticsearch索引中数据的增删改查与并发控制
14 0
|
17天前
|
存储 自然语言处理 数据库
使用Elasticsearch映射定义索引结构
使用Elasticsearch映射定义索引结构
16 0
|
17天前
|
存储 JSON 监控
Elasticsearch索引监控全面解析
Elasticsearch索引监控全面解析
13 0
|
13天前
|
索引
Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
【7月更文挑战第2天】Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
|
6天前
|
存储 缓存 自然语言处理
【Elasticsearch】Elasticsearch倒排索引详解
【Elasticsearch】Elasticsearch倒排索引详解
35 12
|
6天前
|
存储 搜索推荐 数据可视化
【Elasticsearch】Elasticsearch索引创建与管理详解
【Elasticsearch】Elasticsearch索引创建与管理详解
38 10
|
17天前
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
17 3
|
17天前
|
数据库 索引
Elasticsearch索引别名:管理与优化数据访问
Elasticsearch索引别名:管理与优化数据访问
15 2
|
19天前
|
存储 监控 固态存储
elasticsearch索引生命周期管理(ILM):原理和实践
elasticsearch索引生命周期管理(ILM):原理和实践
|
19天前
|
存储 监控 数据挖掘
Elasticsearch 别名:灵活索引管理的利器
Elasticsearch 别名:灵活索引管理的利器