Elasticsearch(ES)的倒排索引

Elasticsearch(ES)的倒排索引是一种数据结构,用于快速定位文档中包含特定词项的文档列表。它的原理如下:

  1. 词项分析: 首先,文档中的文本被分析器(Analyzer)处理,将文本拆分成一系列的词项(Terms),并进行标准化处理(如转换成小写、去除停用词等)。

  2. 构建倒排索引: 对于每个词项,ES 构建一个倒排列表(Inverted List),其中包含包含该词项的所有文档的引用。倒排列表通常按照文档 ID 或者词项频率排序。ES 将所有的倒排列表合并成一个全局的倒排索引。

  3. 查询处理: 当执行查询时,ES 对查询进行同样的词项分析处理,然后检索每个查询词项的倒排列表,并对这些倒排列表进行组合操作,以找到匹配的文档。

  4. 评分计算: 对于检索到的文档,ES 根据查询条件和文档内容计算每个文档的相关性评分(Score),然后按照评分对文档进行排序。

倒排索引的过程主要包括词项分析、倒排索引构建、查询处理和评分计算。通过倒排索引,ES 能够实现高效的全文搜索功能,并且支持复杂的查询操作,如布尔查询、范围查询、模糊查询等。


当我们在 Elasticsearch 中存储一组文档时,它会根据文档中的字段构建倒排索引。让我们假设有以下三个文档:

  1. 文档1:

    json 复制代码
    {
      "id": 1,
      "title": "Elasticsearch 倒排索引",
      "content": "Elasticsearch 是一个分布式的搜索和分析引擎。"
    }
  2. 文档2:

    json 复制代码
    {
      "id": 2,
      "title": "使用 Elasticsearch 进行全文搜索",
      "content": "Elasticsearch 提供了强大的全文搜索功能,支持复杂的查询操作。"
    }
  3. 文档3:

    json 复制代码
    {
      "id": 3,
      "title": "Elasticsearch 教程",
      "content": "学习 Elasticsearch,掌握全文搜索技术。"
    }

假设我们想要搜索包含词项 "Elasticsearch" 的文档。在构建倒排索引时,Elasticsearch 将会为每个词项创建一个倒排列表。这些倒排列表类似于以下内容:

  • 倒排列表 "Elasticsearch":
    • 文档1:[1]
    • 文档2:[2]
    • 文档3:[1, 3]

当我们执行搜索查询 "Elasticsearch" 时,Elasticsearch 将会检索倒排列表 "Elasticsearch",并找到包含该词项的文档。然后根据查询条件和文档内容计算每个文档的相关性评分,并根据评分对文档进行排序。在这个例子中,文档1和文档3包含查询词项 "Elasticsearch",它们可能会在搜索结果中排在前面,而文档2也包含该词项,但在搜索结果中的排名可能会稍后一些。


在 Elasticsearch 中,评分(Scoring)是指根据查询条件和文档内容计算文档相关性的过程。Elasticsearch 使用 TF-IDF(Term Frequency-Inverse Document Frequency)算法来计算文档的相关性分数,该分数用于确定文档在搜索结果中的排序顺序。

评分的计算过程主要涉及以下几个方面:

  1. 词项频率(Term Frequency,TF): TF 衡量了查询词项在文档中出现的频率。通常情况下,词项在文档中出现的次数越多,文档的相关性越高。但是,如果词项在文档中出现的次数过多,可能会导致相关性评分过高,因此 TF 通常会进行对数归一化处理,以避免过度强调频繁出现的词项。

  2. 逆文档频率(Inverse Document Frequency,IDF): IDF 衡量了查询词项在索引中的普遍程度。如果一个词项在大多数文档中都出现,那么它的 IDF 值较低,表示它的重要性较低。相反,如果一个词项只在少数文档中出现,那么它的 IDF 值较高,表示它的重要性较高。IDF 通常通过文档总数与包含词项的文档数量的比值来计算,并进行对数转换。

  3. 字段长度归一化(Length Normalization): 为了避免较长的文档具有更高的评分,Elasticsearch 通常会对文档长度进行归一化处理。常见的归一化方式包括对文档长度进行线性或对数转换。

  4. 字段权重(Field Boost): 在查询中,可以通过对字段应用权重来调整其在评分计算中的重要性。通过增加或减少字段的权重,可以调整其在评分计算中的影响力。

综合考虑上述因素,Elasticsearch 计算出每个文档的相关性评分,并根据评分对文档进行排序,以确定搜索结果的顺序。通常情况下,相关性评分越高的文档越靠前显示在搜索结果中。

相关推荐
Mephisto.java1 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
mqiqe2 小时前
Elasticsearch 分词器
python·elasticsearch
小马爱打代码2 小时前
Elasticsearch简介与实操
大数据·elasticsearch·搜索引擎
java1234_小锋10 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
梦幻通灵16 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客16 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
小黑屋说YYDS1 天前
ElasticSearch7.x入门教程之索引概念和基础操作(三)
elasticsearch
Java 第一深情1 天前
Linux上安装单机版ElasticSearch6.8.1
linux·elasticsearch·全文检索
KevinAha2 天前
Elasticsearch 6.8 分析器
elasticsearch
wuxingge2 天前
elasticsearch7.10.2集群部署带认证
运维·elasticsearch