ElasticSearch之score打分机制原理

这篇具有很好参考价值的文章主要介绍了ElasticSearch之score打分机制原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Elasticsearch 的得分机制是一个基于词频和逆文档词频的公式,简称为 TF-IDF 公式,所以先来研究下 TF-IDF原理。

1. TF-IDF原理

TF-IDF的英文全称是:Term Frequency - Inverse Document Frequency,中文名称词频-逆文档频率。

常用于文本挖掘,资讯检索等应用,在NLP以及推荐等领域都是一个常用的指标,用于衡量字词的重要性。

比较直观的解释是,如果一个词本来出现的频率就很高,如the,那么它就几乎无法带给读者一些明确的信息。

一般地,以TF-IDF衡量字词重要性时

  • 某个字词在某个文档中出现的频率越高,那么该字词对该文档就有越大的重要性,它可能会是文章的关键词(词在单个文档中出现的频率,相对于当个文档!!!)
  • 但若字词在词库中出现的频率越高,那么字词的重要性越低,如the。(相对于整个文档集合,也就是词库)

1.1 计算公式

TF-IDF即是两者相乘,词频乘以逆文档频率,如下:
T F − I D F = T F ∗ I D F TF-IDF=TF*IDF TFIDF=TFIDF
下标ij的含义:编号为j的文档中的词语i在该文档中的词频,即所占比例,n为该词语的数量。如下:

换言之,就是词语出现的次数与文档中所有词总数的比值。
T F i j = n i j n ∗ j TF_{ij} = \frac{n_{ij}}{n_{*j}} TFij=njnij
N表示文档总数,Ni表示文档集中包含了词语i的文档数。

对分子分母加一是为了避免某些词语没有在文档中出现过,导致分母为零的情况。

IDF针对某个词计算了它的逆文档频率,即包含该词语的文档比例的倒数(再取对数),若IDF值越小,分母越大,说明这个词语在文档集中比较常见不具有鲜明的信息代表性,TF-IDF的值就小。

总之TF-IDF的值,通常希望它越大越好,大值代表性强。如下:
I D F i = l o g ( N + 1 N i + 1 ) IDF_i=log (\frac{N+1}{N_i+1}) IDFi=logNi+1N+1

1.2 示例说明

有两个文档,即doc1doc2,并去它们的并集

doc1 = "The cat sat on my bed"
doc2 = "The dog sat on my knees"
# 构建词库,union是并集操作
wordSet = set(doc1.split()).union(set(doc2.split()))

两个文档的并集如下:

{‘The’,‘bed’,‘cat’,‘dog’,‘knees’,‘my’,‘on’,‘sat’}

doc1doc2两个文档对应的词在并集中的统计情况:

序号 cat sat my on dog bed The knees
0 1 1 1 1 0 1 1 0
1 0 1 1 1 1 0 1 1

1.2.1 计算TF

计算词频 TF,对单个文档统计:

再理解一下,何为TF,表示单个单词占当前文档所有单词集合的比值。即1/6=0.16666666666…

cat sat my on dog bed The knees
1 1 1 1 0 1 1 0
0.166666… 0.166666… 0.166666… 0.166666… 0 0.166666… 0.166666… 0

1.2.2 计算IDF

逆文档频率IDF,全局只有一份逆文档频率,对所有文档统计

N表示文档总数,Ni`表示文档集中包含了词语i的文档数。

此时N=2,共有两个文档。Ni表示含有单词的文档个数。

cat sat my on dog bed The knees
0.17609125… 0.0 0.0 0.0… 0.17609125… 0.17609125… 0.0 0.17609125…

1.2.3 TF-IDF计算

最终计算:TF-IDF = TF * IDF

序号 cat sat my on dog bed The knees
0 0.029349 0 0 0 0.029349 0 0 0
1 0 0 0 0.029349 0 0 0 0.029349

2. Elasticsearch打分机制

上面介绍了TF-IDF的原理,而ES的得分机制就是基于词频和逆文档词频的公式,即TF-IDF公式。
s c o r e ( q , d ) = c o o r d ( q , d ) ⋅ q u e r y N o r m ( q ) ⋅ ∑ t i n q ( t f ( t i n d ) ⋅ i d f ( t ) 2 ⋅ t . g e t B o o s t ( ) ⋅ n o r m ( t , d ) ) score(q,d) = coord(q,d)\cdot queryNorm(q)\cdot \sum_{t in q}(tf(t in d)\cdot idf(t){^2}\cdot t.getBoost()\cdot norm(t,d)) score(q,d)=coord(q,d)queryNorm(q)tinq(tf(tind)idf(t)2t.getBoost()norm(t,d))
公式中将查询作为输入,使用不同的手段来确定每一篇文档的得分,将每一个因素最后通过公式综合起来,返回该文档的最终得分。这个综合考量的过程,在ES中这种相关性称为得分。

考虑到查询内容和文档的关系比较复杂,所以公式中需要输入的参数和条件非常得多,但是其中比较重要的其实是TF-IDF算法 ,再次解释一下。

  • TF (词频)

Term Frequency : 搜索文本中的各个词条在查询文本中出现了多少次,次数越多,就越相关,得分会比较高

  • IDF(逆文档频率)

Inverse Document Frequency : 搜索文本中的各个词条在整个索引的所有文档中出现了多少次,出现的次数越多,说明越不重要,也就越不相关,得分就比较低。

2.1 示例说明

在查询语句的最后加上explain=true ,会把得分过程打印。

注:当前ElasticSearchscorpios索引里,只有一个文档。

# 创建索引
PUT /scorpios
# 增加文档数据,此时索引中只有这一条数据
PUT /scorpios/_doc/1
{
 "text":"hello"
}

# 增加分析参数 
GET /scoripos/_search?explain=true 
{ 
 "query": { 
     "match": { 
         "text": "hello" 
         } 
     } 
}

执行后,会发现打分机制中有 2 个重要阶段:计算 TF 值和 IDF
ElasticSearch之score打分机制原理

ElasticSearch之score打分机制原理

最后的分数为:

ElasticSearch之score打分机制原理

2.2 计算 TF 值

f r e q / ( f r e q + k 1 ∗ ( 1 − b + b ∗ d l / a v g d l ) ) freq/(freq + k1 * (1-b+b*dl/avgdl)) freq/(freq+k1(1b+bdl/avgdl))

参数 含义 取值
freq 文档中出现词条的次数 1.0
k1 术语饱和参数 1.2(默认值)
b 长度规格参数(单词长度对于整个文档的影响程度) 0.75(默认值)
dl 当前文中分解的字段长度 1.0
avgdl 查询文档中分解字段数量/查询文档数量 1.0
TF(词频) 1.0/(1+1.2 * (1-0.75+0.75 * 1.0/1.0)) 0.454545

2.3 计算 IDF 值

l o g ( 1 + ( N − n + 0.5 ) / ( n + 0.5 ) ) log(1+(N -n +0.5)/(n + 0.5)) log(1+(Nn+0.5)/(n+0.5))

参数 含义 取值
N 包含查询字段的文档总数(不一定包含查询词条) 1
n 包含查询词条的文档数 1
IDF(逆文档频率) log(1+(1-1+0.5)/(1+0.5)) 0.2875821

注:这里的 log 是底数为e 的对数

2.4 计算文档得分

b o o s t ∗ i d f ∗ t f boost * idf * tf boostidftf

参数 含义 取值
boost 词条权重 2.2(基础值)*查询权重(1)
idf 逆文档频率 0.2876821
tf 词频 0.454545
score(得分) 2.20.28768210.454545 0.2876821

2.5 增加新的文档测试得分

  • 增加一个毫无关系的文档
# 增加文档
PUT /scorpios/_doc/2
{
 "text" : "spark"
}
# 得分:0.6931741
GET /scorpios/_search
{
     "query": {
        "match": {
            "text": "hello"
        }
     } 
 }

因为新文档无词条相关信息,所以匹配的文档数据得分就应该较高

  • 增加一个一模一样的文档
# 增加文档
PUT /scorpios/_doc/2
{
 "text" : "hello"
}

# 得分:0.18232156
GET /scorpios/_search
{
 	"query": {
 		"match": {
 			"text": "hello"
 		}
	}
}

因为新文档含词条相关信息,且多个文件含有词条,所以显得不是很重要,得分会变低

  • 增加一个含有词条,但是内容较多的文档
# 增加文档
PUT /scorpios/_doc/2 
{
	"text" : "hello elasticsearch" 
}
# 得分:0.14874382
GET /scorpios/_search
{
     "query": {
         "match": {
         	"text": "hello"
         }
     }
 }

因为新文档含词条相关信息,但只是其中一部分,所以查询文档的分数会变得更低一些。

3. 案列

3.1 需求

查询文档标题中含有Hadoop,Elasticsearch,Spark的内容,优先选择Spark的内容

3.2 准备数据

# 创建索引
PUT /test
# 准备数据
PUT /test/_doc/1001
{
	"title" : "Hadoop is a Framework",
	"content" : "Hadoop 是一个大数据基础框架" 
}
PUT /test/_doc/1002
{
	"title" : "Hive is a SQL Tools",
	"content" : "Hive 是一个 SQL 工具" 
}
PUT /test/_doc/1003
{
	"title" : "Spark is a Framework",
	"content" : "Spark 是一个分布式计算引擎" 
}

3.3 查询数据

# 查询文档标题中含有“Hadoop”,“Elasticsearch”,“Spark”的内容
GET /test/_search?explain=true
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "Hadoop", "boost": 1
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "Hive", "boost": 1
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "Spark", "boost": 1
            }
          }
        }
      ]
    }
  }
}

此时会发现,Spark的结果并不会放置在最前面

ElasticSearch之score打分机制原理

此时可以更改 Spark 查询的权重参数 boost,看看查询的结果有什么不同

# 查询文档标题中含有“Hadoop”,“Elasticsearch”,“Spark”的内容
GET /test/_search?explain=true
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "Hadoop", "boost": 1
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "Hive", "boost": 1
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "Spark", "boost": 2
            }
          }
        }
      ]
    }
  }
}

ElasticSearch之score打分机制原理文章来源地址https://www.toymoban.com/news/detail-424411.html

到了这里,关于ElasticSearch之score打分机制原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

    之前我们学习了布尔查询,知道了filter查询只在乎查询条件和文档的匹配程度,但不会根据匹配程度对文档进行打分,而对于must、should这两个布尔查询会对文档进行打分,那如果我想在查询的时候同时不去在乎文档的打分(对搜索结果的排序),只想过滤文本字段是否包含这

    2024年02月11日
    浏览(32)
  • Elasticsearch(5) function_score的使用

    elasticsearch version: 7.10.1 Elasticsearch 中的 function_score 查询允许你根据一组定制函数来调整每个文档的评分,从而影响搜索结果的排序 第一个函数给品牌为\\\"luxury\\\"的文档增加了两倍的权重 第二个函数依据popularity字段的值来调整评分,使用的是自然对数(ln(1+x))作为调整因子,

    2024年04月15日
    浏览(36)
  • 关于ES中Function_Score在自定义打分中的应用

    现在有许多商品需要在商品列表中进行排序展示,排序要求使用ES并且尽量一次性查出来,有要求如下: 重点商品,收藏商品,优质商品,普通商品的顺序展出 在同一类商品发生冲突时,按照自主产品,非自主产品进行展出(是否自主产品是一个集合,只有集合里面有7才属于

    2024年02月10日
    浏览(31)
  • ElasticSearch第十一讲 ES检索评分score以及分数计算逻辑

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度。Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 Term frequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关

    2023年04月23日
    浏览(25)
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。 function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。 近期有同学反馈,function_score 的相关参数不好理解,本文将深入探讨 function_score 的核心参数和函数。 Elasticsear

    2024年02月14日
    浏览(33)
  • ElasticSearch[八]:自定义评分功能、使用场景讲解以及 function_score常用的字段解释

    基本介绍 ES 的使用中,ES 会对我们匹配文档进行相关度评分。但对于一些定制化的场景,默认评分规则满足不了我们的要求。这些定制化场景,ES 也是推出了自定义评分方式来进行支持。可以使用 ES 提供的一些函数,什么可以使用较分来让我们的评分规则多样化。我举个大

    2024年01月24日
    浏览(30)
  • 使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

    Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索,但它的用途广泛,足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现以及利用 script_score 函数

    2024年02月07日
    浏览(40)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(59)
  • ES系列--打分机制

    当你通过搜索相关文档时,可能会出现多个文档,这些文档的顺序是通过一个max_score属性的大小从高到低顺序展现出来的,max_score属性就是我们所说的评分。而这个评分是通过一个文档打分机制计算出来的。 一、总公式 max_score = boost  *  idf  *  tf  其中,查询权重可

    2024年02月16日
    浏览(30)
  • 【Elasticsearch专栏 08】深入探索:Elasticsearch中的Routing机制详解

    在深入研究Elasticsearch的内部工作原理时,不可避免地会遇到“Routing”这一概念。Routing是Elasticsearch中用于确定文档应存储在哪个分片上的机制。理解Routing的工作原理对于优化Elasticsearch集群的性能、确保数据的一致性和实现特定的数据布局策略至关重要。 01 Routing的基础 Ela

    2024年04月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包