从我们在elasticsearch复合框输入搜索语句到结果显示,展现给我们的是一个按score得分从高到底排好序的结果集。下面就来学习下elasticsearch怎样计算得分。

Lucene(或 Elasticsearch)使用 布尔模型(Boolean model) 查找匹配文档, 并用一个名为 实用评分函数(practical scoring function) 的公式来计算相关度。这个公式借鉴了 词频/逆向文档频率(term frequency/inverse document frequency) 和 向量空间模型(vector space model),同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。

Lucene计算评分的公式:

这个评分公式有6个部分组成:

coord(q,d) 评分因子,基于文档中出现查询项的个数。越多的查询项在一个文档中,说明文档的匹配程度越高。

queryNorm(q)查询的标准查询

tf(t in d) 指项t在文档d中出现的次数frequency。具体值为次数的开根号。

idf(t) 反转文档频率, 出现项t的文档数docFreq

t.getBoost 查询时候查询项加权

norm(t,d) 长度相关的加权因子

1、tf(t in d) 词频

tf(t in d) = √frequency

即出现的个数进行开方,这个没什么可以讲述的,实际打分也是如此。

2、idf(t)反转文档频率

这个的意思是出现的逆词频数,即召回的文档在总文档中出现过多少次,这个的计算在ES中与lucene中有些区别,只有在分片数为1的情况下,与lucene的计算是一致的,如果不唯一,那么每一个分片都有一个不同的idf的值,它的计算方式如下所示:

idf(t) = 1 + log ( numDocs / (docFreq + 1))

其中,log是以e为底的,不是以10或者以2为底,这点需要注意,numDocs是指所有的文档个数,如果有分片的话,就是指的是在当前分片下总的文档个数,docFreq是指召回文档的个数,如果有分片对应的也是在当前分片下召回的个数,这点是计算的时候与lucene不同之处,如果想验证是否正确,只需将分片shard的个数设置为1即可

3、queryNorm(q)查询的标准查询

queryNorm(q) = 1 / √sumOfSquaredWeights

上述公式是ES官网的公式,这是在默认query boost为1,并且在默认term boost为1 的情况下的打分,其中

sumOfSquaredWeights =idf(t1)*idf(t1)+idf(t2)*idf(t2)+...+idf(tn)*idf(tn)

其中n为在query里面切成term的个数,但是上面全部是在默认为1的情况下的计算,实际上的计算公式如下所示:

4、coord(q,d)协调因子

coord(q,d)=overlap / maxoverlap

其中overlap是检索命中query中term的个数,maxoverlap是query中总共的term个数

5、t.getboost()

对于每一个term的权值,没仔细研究这个项,个人理解的是,如果对一个field设置boost,那么如果在这个boost召回的话,每一个term的boost都是该field的boost

6、norm(t,d)

对于field的标准化因子,在官方给的解释是field越短,如果召回的话权重越大

其中d.getboost表明如果该文档权重越大那么久越重要

f.getboost表明该field的权值越大,越重要

lengthnorm表示该field越长,越不重要,越短,越重要,在官方文档给出的公式中,默认boost全部为1,在此给出官方文档的打分公式:

norm(d) = 1 / √numTerms

如查询解析语句得分:

_search?explain

{
  "query": {
    "multi_match": {
    "query": "居夷集第三卷",
    "fields": [
      "title",
      "keywords",
      "author"
    ]
    }
  }
}

multi_match默认选择fields中得分最高的作为最终的得分相当于max(field_score),如下图:红框1的得分是属性keywords中居在文档id=51时的得分(红框1= 红框2 * 红框3)

具体的计算公式:红框2处的得分由 queryWeight * fieldWeight 两部分的乘积组成。词频tf(t),反向文档频率idf(t)

如:queryWeight = idf(t) * queryNorm(d)

idf(t) = ( 1+ln( maxDocs / (docFreq +1 ) ) )  = (1 + ln ( 3091 / ( 2 +1 )) 注意这个是自然对数

再来看一个只有一个分片的索引来加深刚才的计算,其实在es的head插件中显示的得分的计算公式实际可以对应的就是:

sumScore = partScore1 +partScore2 +partScore3 + ...

partScore = queryWeight * fieldWeight

queryWeight =  idf(t) * queryNorm(d)

fieldweight = idf * tf * fieldnorm

总得分:0.5216244 = 0.119818024 + 0.119818024 + 0.119818024 + 0.119818024 + 0.04235228

partScore 1 : 0.119818024  = 0.4792721 * 0.25

queryWeight  : 0.4792721  =( 1 +  ln( 2 / (1+1 ) )  ) *  (1/ √ (1*1+1*1+1*1+1*1 + 0.5945349*0.5945349))

fieldweight  : 0.25 = 1 * 1 * 0.25

Reference:

[1] http://blog.csdn.net/molong1208/article/details/50623948

[2] http://www.cnblogs.com/forfuture1978/archive/2010/03/07/1680007.html

[3] https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

转载于:https://www.cnblogs.com/jpfss/p/10775376.html

ELASTICSEARCH 搜索的评分机制相关推荐

  1. 分布式搜索elasticsearch搜索功能【深入】

    elasticsearch搜索功能[深入] 分布式搜索elasticsearch搜索功能[深入] 1.数据聚合 1.1 聚合的种类 1.2 DSL实现聚合 1.2.1 Bucket聚合 1.2.2 M ...

  2. 从提高 Elasticsearch 搜索体验说开去......

    Elasticsearch 最少必要知识实战教程直播回放 1.实战问题 球友提问:怎么搜索才能使得结果是最好的呢? 我这边一个搜索功能,实现做法就是将用ik分词器配合multi查询实现的. 中途也追加 ...

  3. Elasticsearch搜索结果处理

    CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:Java学习记录 话题描述 ...

  4. ElasticSearch(搜索服务器)-第一天

    1为什么使用es ElasticSearch 搜索服务器.简称es. 初识es 搜索时数据库的问题 2.1是什么 搜索服务器 软件 2.1.1互联网搜索 https://www.baidu.com/ ...

  5. 【Android】Android网络评分机制简单总结

    文章参考于: 三.Android 网络评分机制 - 简书在前两节简单介绍了连接管理的大致框架,数据链接的准备工作,包括APN的初始化与默认APN使能,DcTracker的构造,包括各种事件的注册等工作 ...

  6. Elasticsearch 搜索测试与集成Springboot3

    Elasticsearch是专门做搜索的,它非常擅长以下方面的问题 Elasticsearch对模糊搜索非常擅长(搜索速度很快) 从Elasticsearch搜索到的数据可以根据评分过滤掉大部分的,只 ...

  7. elasticsearch搜索分数自定义以及相关度计算相关

    elasticsearch搜索分数自定义以及相关度计算相关 es通过其score字段对搜索结果进行排序 在进行业务开发时通常其默认的分数计算是不符合预期的. 最简单的方法是通过boost字段来对每一个 ...

  8. kotlin + springboot启用elasticsearch搜索

    参考自: http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p=78908 工具版本: elasticsearch ...

  9. Apache Nutch 1.3 学习笔记十一(页面评分机制 OPIC)

    1. Nutch 1.3 的页面评分机制 Nutch1.3目前默认还是使用OPIC作为其网页分数算法,但其之后,已经引入了PageRank-like算法,以弥补OPIC算法的不足,目前OPIC算法还是 ...

最新文章

  1. Python拼接多张图片
  2. 2009.11网络工程师考试案例试题学习攻略(1)
  3. 洛谷 P1417 烹调方案
  4. hadoop 传感器数据_hadoop为什么是大数据学习的核心技术?
  5. 指定的服务已经标记为删除_你的电话号码被标记过吗?你知道这件事情还能赚钱吗?...
  6. 【pyqt5学习】——graphicView显示matplotlib图像
  7. 李宏毅机器学习(六)自监督学习(一)
  8. 理解 JavaScript 作用域
  9. 基于ET6框架的资源热更
  10. 如何打开caj文件,以及caj文件如何转换为PDF格式
  11. Mbed OS STM32F429 中断方式接收 ADS1256
  12. 妇女节手抄报Word电子小报
  13. 现代密码学(五) 数论和密码学困难性假设
  14. 论文笔记:基于并行注意力 UNet的裂缝检测方法
  15. mysql mmm write vip_MySQLHAbyusingMysql-mmm
  16. spring boot启动 Failed to scan from classloader hierarchy 解决方案
  17. Eclipse+多国语言包插件+Tomcat插件+Lomboz插件+Myeclipse插件的安装与配置
  18. 软件测试周刊(第34期):一岁有一岁的味道,一站有一站的风景
  19. What is Unified Extensible Firmware Interface (UEFI)?
  20. 微信小程序尺寸及外边距设置调整技巧

热门文章

  1. windows下的可执行程序可以再linux下运行吗?
  2. ubuntu下安装telnet服务
  3. 示坡线高程判断_【专题突破】等高线地形图的判读技巧
  4. 世界数学难题——哥尼斯堡七桥问题 哥尼斯堡七桥问题
  5. git 删除分支和删除文件夹
  6. static修饰符和final修饰符
  7. OpenCV实战5 车牌号识别
  8. 小时候父亲是座山,我长大后山却垮了
  9. NBA赛事直播超清画质背后:阿里云视频云「窄带高清2.0」技术深度解读
  10. 条形码扫描器识别条形码的原理