Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES相关性计算原理

ES相关性计算原理

作者头像
Steve Wang
发布于 2024-05-05 00:32:35
发布于 2024-05-05 00:32:35
14500
代码可运行
举报
文章被收录于专栏:从流域到海域从流域到海域
运行总次数:0
代码可运行

了解es搜索过程中的相关性计算原理,对判断当前应用场景是否适合使用es来召回相关结果至关重要。本篇博文尝试对es在每一个节点执行搜索时如何计算query和经由倒排索引查询到的对应字段文本之间的相关性做简要说明。

ES搜索过程(节点层面)

ES的搜索过程具体到每一个节点可以简单地描述为三个步骤:

分词

计算相关性

查询解析

按分词结果执行term查询

按相关性排序,返回优先队列顺序长度的结果

当我们在ES中使用关键字搜索文档时,会得到由from+size指定的窗口大小多个文档,这些文档按照max_score的大小从高到低排列。毫无疑问,max_score衡量了查询结果和关键字之间的相似度或者说相关度大小,那么你是否好奇过它是如何计算出来的,本篇博文就来谈谈max_score的计算过程。

max_score如何计算

tf-idf公式

自然语言处理有一个计算文档权重的tf-idf公式(tf*idf),max_score的计算,也主要使用该公式。其中TF词频(Term Frequency)指的是词条t在文档中出现的频率IDF逆向文件频率(Inverse Document Frequency)指的是包含词条t的文档总数/全部文档总数的倒数取对数(逆向的意思就是取倒数,即全部文档总数/包含词条t的文档总数)。

tf不难理解,同一个文档中出现频率越高的词重要程度越高,idf是为了排除同时在多个文档出现的高频词,比如定冠词the、a的在同一个文档中词频很高,且在多个文档中出现,但是并没有什么实际意义,因而取倒数作为一种重要性上的惩罚

tf-idf公式的核心思想是:如果某个词条在一篇文章中出现的频率TF很高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

max_score计算公式

max_score计算公式如下,max_score

=boosttfidf

,其中tfidf的计算稍有不同,下文有详细说明,boost可以手动指定,用来控制查询词条的权重。

参数

含义

取值示例

boost

词条权重

2.2(基础值)* 当前字段查询权重(默认为1,可以手动指定)

tf

词频

0.66753393

idf

逆文档频率

6.2964954

max_score

得分

9.246874 = 2.2 × 1 × 0.66753393 × 6.2964954 9.246874 = 2.2\times1 \times 0.66753393\times6.2964954 9.246874=2.2×1×0.66753393×6.2964954

9.246874=2.2×1×0.66753393×6.2964954

在search时,通过指定参数explain=true,即可在返回的_explanation字段内看到max_score的计算过程和中间结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /test_index/_search?explain=true
{
    "query": {
        "match": {
            "test_field": "测试用query"
        }        
    }
}

上述示例查询结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  ... # 省略其他字段
  "_explanation" : {
    "value" : 9.246874,
    "description" : "sum of:",
    "details" : [
      {
        "value" : 9.246874,
        "description" : "weight(test_field:升级 in 398) [PerFieldSimilarity], result of:",
        "details" : [
          {
            "value" : 9.246874,
            "description" : "score(freq=1.0), product of:",
            "details" : [
              {
                "value" : 2.2,
                "description" : "boost",
                "details" : [ ]
              },
              {
                "value" : 6.2964954,
                "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                "details" : [
                  {
                    "value" : 1,
                    "description" : "n, number of documents containing term",
                    "details" : [ ]
                  },
                  {
                    "value" : 813,
                    "description" : "N, total number of documents with field",
                    "details" : [ ]
                  }
                ]
              },
              {
                "value" : 0.66753393,
                "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                "details" : [
                  {
                    "value" : 1.0,
                    "description" : "freq, occurrences of term within document",
                    "details" : [ ]
                  },
                  {
                    "value" : 1.2,
                    "description" : "k1, term saturation parameter",
                    "details" : [ ]
                  },
                  {
                    "value" : 0.75,
                    "description" : "b, length normalization parameter",
                    "details" : [ ]
                  },
                  {
                    "value" : 2.0,
                    "description" : "dl, length of field",
                    "details" : [ ]
                  },
                  {
                    "value" : 9.088561,
                    "description" : "avgdl, average length of field",
                    "details" : [ ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}

下面我们来仔细研究一下这里面的每一项。

计算tf

tf(Term Frequency,词频):搜索文本分词后各个词条(term)在被查询文档的相应字段中出现的频率,频率越大,相关性越高,得分就越高。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "value" : 0.66753393,
  "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
  "details" : [
    {
      "value" : 1.0,
      "description" : "freq, occurrences of term within document",
      "details" : [ ]
    },
    {
      "value" : 1.2,
      "description" : "k1, term saturation parameter",
      "details" : [ ]
    },
    {
      "value" : 0.75,
      "description" : "b, length normalization parameter",
      "details" : [ ]
    },
    {
      "value" : 2.0,
      "description" : "dl, length of field",
      "details" : [ ]
    },
    {
      "value" : 9.088561,
      "description" : "avgdl, average length of field",
      "details" : [ ]
    }
  ]
}
tf=freqfreq+k1×(1b)+b×dlavgdl

参数

含义

示例取值

freq

文档中词条出现的次数

1.0

k1

词条饱和参数

1.2(默认值)

b

长度规格化参数(平衡词条长度对于整个文档的影响程度)

0.75(默认值)

dl

搜索的关键词在当前文档中的分解字段长度

2.0

avgdl

查询出来的所有文档被字段分解长度总和/查询文档总数

9.088561

可以理解为自然语言处理中的tf做了一定程度的正则化

计算idf

idf(Inverse Document Frequency,逆文档频率):搜索文本中分词后各个词条(term)在整个索引的所有文档中出现的频率倒数,频率越大,频率倒数越小,相关性越低,得分就越低。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "value" : 6.2964954,
  "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
  "details" : [
    {
      "value" : 1,
      "description" : "n, number of documents containing term",
      "details" : [ ]
    },
    {
      "value" : 813,
      "description" : "N, total number of documents with field",
      "details" : [ ]
    }
  ]
}
idf=log(1+(Nn+0.5)n+0.5)

参数

含义

示例取值

n

包含查询词条的文档总数

1

N

包含查询字段的文档总数

813

同样也可以理解为自然语言处理中的idf做了一定程度的正则化

boost查询权重

boost在同一个字段匹配多个词条时才有实际意义,它用来控制每个词条的计算相关度的权重。

示例查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /test_index/_search?explain=true

{
    "query": {
        "bool": {
            "should": [{
                    "match": {
                        "test_field": {
                            "query": "xxx",
                            "boost": 1
                        }
                    }
                },
                {
                    "match": {
                        "test_field": {
                            "query": "yyy",
                            "boost": 2
                        }
                    }
                },
                {
                    "match": {
                        "test_field": {
                            "query": "zzz",
                            "boost": 3
                        }
                    }
                }
            ]
        }
    }
}

在上面的搜索计算相关度时,文档命中词条xxx时指定boost=1计算max_score,命中命中词条yyy时指定boost=2计算max_score,命中词条zzz时指定boost=3计算max_score

参考文献
  1. ES系列–打分机制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何提高Elasticsearch搜索的相关性
首先需要了解什么是相关性?默认情况下,搜索返回的结果是按照 相关性 进行排序的,也就是最相关的文档排在最前。相关性是由一个所谓的打分机制决定的,每个文档在搜索过程中都会被计算一个_score字段,这是一个浮点数类型,值越高表示分数越高,也就是相关性越大。
用户7634691
2021/03/18
1K0
ES系列13:彻底掌握相关度:从TF-IDF、BM25到对相关度的控制
ES 5.0 之前,默认的相关性算分采用的是 TF-IDF,而之后则默认采用 BM25。
方才编程_公众号同名
2020/11/13
1.9K0
ES系列13:彻底掌握相关度:从TF-IDF、BM25到对相关度的控制
Elasticsearch评分相关度算法解析
TF算法,全称 Term frequency ,索引词频率算法。意义就像它的名字,会根据索引词的频率来计算,索引词出现的次数越多,分数越高。
憧憬博客
2020/09/27
4600
【Elasticsearch系列十九】评分机制详解
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的统计方法,用以评估一个词在一个文档集中一个特定文档的重要程度。这个评分机制考虑了一个词语在特定文档中的出现频率(Term Frequency,TF)和在整个文档集中的逆文档频率(Inverse Document Frequency,IDF)。
kwan的解忧杂货铺
2024/09/22
910
干货 | 一步步拆解 Elasticsearch BM25 模型评分细节
Elasticsearch 5 之前的版本,评分机制或者打分模型基于 TF-IDF 实现。
铭毅天下
2021/07/22
2.6K0
深入理解TF-IDF、BM25算法与BM25变种:揭秘信息检索的核心原理与应用
在信息检索, 文本挖掘和自然语言处理领域, IF-IDF 这个名字, 从它在 20 世纪 70 年代初被发明, 已名震江湖近半个世纪而不曾衰歇. 它表示的简单性, 应用的有效性, 使得它成为不同文本处理任务文本特征权重表示的首选方案. 如果要评选一个 NLP 领域最难以被忘记的公式, 我想, TF-IDF 应该是无可争议的第一和唯一. 虽然在以上领域,目前出现了不少以深度学习为基础的新的文本表达和权重(Weighting)表示方法,但是 TF-IDF 作为一个古董方法,依然在很多应用中发挥着不可替代的作用. TF-IDF 一般是文本处理领域初学者入门阶段就会了解到的概念, 了解和掌握 TF-IDF 算法, 能够帮助初学者更快地理解其它更加深入复杂的文本挖掘算法和模型. 以下我会从 TF-IDF 的应用背景, TF-IDF 的发现历史, 算法公式及其变种, TF-IDF 的应用几个方面来介绍和展开讨论.
汀丶人工智能
2024/01/09
2.3K0
【你真的会用ES吗】ES基础介绍(二)
在上一篇文章ES基础信息(一)中,介绍了ES的背景、版本更新细则、建立索引所需要了解的基础概念以及常用的搜索关键字。本篇文章会继续补充一些全文索引相关的内容,分析器,相关性得分等等。
Lynalmost
2022/06/27
1.5K1
【你真的会用ES吗】ES基础介绍(二)
ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制
elasticsearch 提供了几个内置的分词器:standard analyzer(标准分词器)、simple analyzer(简单分词器)、whitespace analyzer(空格分词器)、language analyzer(语言分词器)
汀丶人工智能
2023/11/02
5940
ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制
Elasticsearch探索:Suggester API(一)
现代的搜索引擎,一般都会提供 Suggest as you type 的功能,帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档匹配的程度。在 google 上搜索,一开始会自动补全。当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或者句子。
HLee
2020/12/17
5.8K1
Elasticsearch探索:Suggester API(一)
Elasticsearch控制相关度
Elasticsearch 提供了一个最重要的功能就是相关性。它可以帮我们按照我们搜索的条件进行相关性计算。每个文档有一个叫做 _score 的分数。在默认没有 sort 的情况下,返回的文档时按照分数的大小从大到小进行排列的。
HLee
2021/01/07
2.3K0
Elasticsearch控制相关度
十九种Elasticsearch字符串搜索方式终极介绍
刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪里。出现这个问题归根结底是因为对于Elasticsearch的底层索引原理以及各个查询搜索方式的不了解,在Elasticsearch中仅仅字符串相关的查询就有19个之多,如果不弄清楚查询语句的工作方式,应用可能就不会按照我们预想的方式运作。这篇文章就详细介绍了Elasticsearch的19种搜索方式及其原理,老板再也不用担心我用错搜索语句啦!
用户7353950
2022/05/10
1.3K0
elasticsearch-DSL高级查询语法
》比如,query的时候,会先比较查询条件,然后计算分值,最后返回文档结果; 而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。 综上所述,filter快在两个方面: 1 对结果进行缓存 2 避免计算分值
黎明大大
2020/09/08
3.9K0
elasticsearch-DSL高级查询语法
触类旁通Elasticsearch:打分
使得ES查询与select * from users where name like 'bob%'查询不同的是其为文档赋予相关性得分的能力。从这个得分,可以得知文档和原始的查询有多么相关。
用户1148526
2019/05/25
2K0
干货 | ElasticSearch相关性打分机制
作者简介 孙咸伟,后端开发一枚,在携程技术中心市场营销研发部负责“携程运动”项目的开发和维护。 携程运动是携程旗下新业务,主要给用户提供羽毛球、游泳等运动项目的场馆预定。最近我们在做场馆搜索的功能时,接触到elasticsearch(简称es)搜索引擎。 我们展示给用户的运动场馆,在匹配到用户关键词的情况下,还会综合考虑多种因素,比如价格,库存,评分,销量,经纬度等。 如果单纯按场馆距离、价格排序时,排序过于绝对,比如有时会想让库存数量多的场馆排名靠前,有时会想让评分过低的排名靠后。有时在有多家价格相同的
携程技术
2018/03/16
8.5K1
干货 | ElasticSearch相关性打分机制
ElasticSearch权威指南:基础入门(中)
官方网站:https://www.elastic.co/guide/index.html
HLee
2021/03/19
6.4K0
ElasticSearch权威指南:基础入门(中)
ElasticSearch-查询
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
yuanshuai
2023/11/17
2240
ElasticSearch-查询
搜索中的权重度量利器: TF-IDF和BM25
我们在网上搜东西时,搜索引擎总是会把相关性高的内容显示在前面,相关性低的内容显示在后面。那么,搜索引擎是如何计算关键字和内容的相关性呢?这里介绍2种重要的权重度量方法:TF-IDF和BM25。
Stanley Sun
2019/09/23
2K0
搜索中的权重度量利器: TF-IDF和BM25
一起学Elasticsearch系列-Query DSL
DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
BookSea
2023/11/13
5091
一起学Elasticsearch系列-Query DSL
Elasticsearch全文搜索与TF/IDF
TF:Term Frequency,即词频。它表示一个词在内容(如某文章)中出现的次数。为了消除文档本身大小的影响,通常,它的定义是:
Stanley Sun
2019/09/23
2K0
019.Elasticsearch搜索原理
搜索"mother like little dog",首先分词,然后查看这些单词出现过的id,就返回了id为1和2的这两条文档
CoderJed
2020/07/14
3430
相关推荐
如何提高Elasticsearch搜索的相关性
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验