java es score_elasticsearch系列(五)score

2023-11-08

概述

score在ES中有着很重要的作用,有了它才有了rank,是验证文档相关性的关键数据,score越大代表匹配到的文档相关性越大

官方解释

查询的时候可以用explain来展示score的计算过程,也可以增加format=yaml来讲json转成yaml方便阅读

类似xxx/_search?explain&format=yaml

下图是通过explain看到的一部分json,其实这个解释中就展示出了计算公式,不得不说ES在这点上还是很人性化的

0a0d64f14f4e54356df6aae396e714b2.png

计算方式

常说的相关性是指计算一个全文(full-text)字段的内容与全文查询字符串的相似程度的算法。

这个算法默认是BM25,一个基于TF-IDF(term frequency/inverse document frequency)的算法。

TF-IDF

首先是TF(term frequency),顾名思义,term在field出现的频率越高,则该term与field的相关性越高。

公式:

sqrt(TF)

然后是IDF(inverse document frequency),term在整个index出现的频率越高,则该term与该document的相关性越低。

公式:

Log(numDocs / docFreq + 1) + 1

BM25

BM全称(Best Match),这个名称不得不说有点过分,这个算法也同样有TF和IDF。

TF,BM25把TF的影响范围减小了,不像TF-IDF一样没有边界

公式:

(k+1)* tf /(k + tf),k一般是个常量,[1.2,2],通过k可以改变回归的速度。

IDF几乎一样,只是多加了1(为了提高其整体影响比重)

BM25新加了另一个特征,Field-length norm,field的长度有多少,如果field的长度越长,则该term与field的相关性越低(分母越大,概率越小)。

公式:

|d|/avgDl(本文档的长度除以平均文档的长度)

下图为不同文档长度对应相同tf所影响最终tf的曲线。

公式:

(k + 1)* tf / k * ( 1.0 - b + b - L + tf) (其中b为常数)

BM25 Field-length norm之间的对比

6314414cf47a80af68ff1b8eba906e70.png

TF-IDF和BM25对比

在TF角度的对比

45583f5dfc40735170073742232e8051.png

计算流程

Score的计算过程依赖query clause(查询子条件),例如:

1.模糊查询计算匹配到的word和原来的word(匹配前的word)的相似度

2.term查询会包含找到该term所占的百分比

个别查询会结合TF-IDF的socre和其它因素,越多的query clause(查询子条件)匹配到,那么score就越高,具体来说,是query clause匹配得到的score联合起来计算出最终的score。

需要注意的是,TF-IDF默认是基于shard来计算的,假设1个index有5个shards,则就有5个TF-IDF的结果,也就是5个score,然后score再汇聚到request node,做排序后得到最终结果。所以这有产生了另一个问题,当index的documents数量较少时,score的结果会不准确,毕竟不是全局的,shard也只是通过hash来区分,有很大的随机性和偶然性。针对这种情况,ES给出了DFS Query Then Fetch(默认是采用Query Then Fetch)这种解决方案,采用全局计算TF-IDF的方式,解决这个问题,在查询的时候可以这么设置

search_type=dfs_query_then_fetch

(不过会影响效率,毕竟是全局计算,多了几次socket传输)。其实还有一种解决方法,直接把index的shard设置成1,这样自己就代表了全局。

Query Then Fetch

稍微解释一下Query Then Fetch,顾名思义,是先查询后获取。

查询流程如下

a02eceb62993ae56224dca70bb60a41b.png

score as percentage

刚接触score的时候,总有疑惑,为什么不是一个百分比,这样可能更加直观的表现出匹配到正确的概率,也就是术语”normalized socre”。

这么想是错误的!

Score的意义仅仅在于对比一次查询的多个结果的对比,起到rank作用,并不能代表匹配到的概率,更不能拿几个匹配到的概率做比较,比如:当一个document本身没有发生变化,但是index发生变化,就会影响匹配到document的sorce。这样的概率是没什么意义的,虽然你可以强行造出一个概率。

另外

在做业务的过程中领悟到,搜索系统和推荐系统不是一个系统(之前没想过这个问题),重要区别之一就是主动和被动,详细看这篇博客吧,说的很详细了

参考资料

//官方对相关性的解释,也就是score的计算标准

//当你的数据很少时,请用DFS Query Then Fetch搜索方法

//ES的两个搜索方法

//ES官方解释的BM25和TF-IDF区别

//外国友人对BM25和TF-IDF的解读

//外国友人吐槽 当score变成percentage的后果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java es score_elasticsearch系列(五)score 的相关文章

  • 安卓默认启动的活动界面

    是在AndroidManifest 的activity 的标签中 加入 的活动是默认启动的
  • ENVI5.3安装

    一 下载地址 BT下载地址 链接 https pan baidu com s 1Z1l0qXQjSaEf3VQj9 qcAw 提取码 4il4 压缩包下载 链接 https pan baidu com s 1EbdO0uDiBdbFFdQx
  • java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解

    一 自定义score的应用场景 先打个比方 比如新产品上架了 我想让最新上架的产品搜索时候 排在前面 怎么办呢 很简单按时间排序 嗯这种方法很好实现 但下面又有个需求 比如我要求排序中上架时间的比重为40 自营产品为20 促销产品的比重为4
  • git branch管理常用命令

    本文转载至 http www 2cto com os 201307 229235 html git branch管理常用命令 查看本地分支 plain git branch dev master 代表当前位于dev分支 查看远程分支 pla
  • python netcdf4读取nc格式的气象数据

    一 nc格式数据介绍 NetCDF全称为network Common Data Format 中文译法为 网络通用数据格式 netcdf文件开始的目的是用于存储气象科学中的数据 现在已经成为许多数据采集软件的生成文件的格式 从数学上来说 n
  • PROJ4是什么?

    GIS Geographic Information System 地理信息系统 领域中最常提及 的一个概念是坐标系统 当我们提及一个地理位置的时候 与之伴随而产生的是该位置必定在一个空间参考下 当我们使用GPS设备获取到某个位置的经纬度的
  • Linux常用配置及硬件检测命令

    一些比较常见的linux命令 主要用于检测服务器的配置和硬件信息 包括 操作系统 CPU 内存 硬盘分区 系统时间 负载 网络相关 进程 用户 开关机 启动等方面 适用于主流操作系统 常见的centos ubuntu debian等 操作系
  • python selenium 三种等待方式详解

    引言 当你觉得你的定位没有问题 但是却直接报了元素不可见 那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素还没出来就已经报错了 试着程序调试程序运行速度 等待元素可见再继续运行程序 1 强制等待 sleep 优点 简单明了 需
  • 【国家参考文献标准GB/T 7714—2015】

    GB T 7714 2015 2 1 参考文献著录方法几种主要类型的参考文献 专著 专著中的析出文献 连续出版物 连续出版物中的析出文献 专利文献 电子文献等 的著录项目与格式要求如下 2 1 1 专著 图书 M 指以单行本或多卷册形式 在
  • 游戏开发unity编辑器扩展知识系列:获取选中文件的路径

    参考 Unity 编辑器下获取选择文件路径
  • Python中如何输出换行?

    Python中如何输出换行 在Python中 输出换行可以使用的方法有两种 分别是用转义符号或使用print 接下来我们通过这篇文章为大家详细的讲解一下 方法1 用转义符号 str3 老男孩教育 n str4 帮助有志向的年轻人通过努力学习
  • Threejs + vue 学习- VR 看房

    知识点 参考链接 threejs github 图片下载 https gitee com congyingcy threejs learning tree master three public imgs 直接跳转 代码下载 直接跳转 立方
  • maven自定义Archetype

    1 创建模板项目 如下 2 模板项目的pom xml中添加archetype插件
  • 光纤验收测试标准、参数及常用设备

    在光纤工程项目中必须执行一系列的测试以确保其完整性 一根光缆从出厂到工程安装完毕 需要进行机械测试 几何测试 光测及传输测试 前3个测试一般在工厂进行 传输测试则是光缆布线系统工程验收的必要步骤 综合布线工程电气测试包括电缆系统电气性能测试
  • ChatGPT追祖寻宗:GPT-1论文要点解读

    论文地址 Improving Language Understanding by Generative Pre Training 最近一直忙着打比赛 好久没更文了 这两天突然想再回顾一下GPT 1和GPT 2的论文 于是花时间又整理了一下
  • mysql(十)mysql主从复制--主库切换

    概述 可能为了更迭升级服务器 或者主库出现问题 又或者只是希望重新分配容量 此时需要切换主库 如果这是计划内的切换 会相对容易点 只需要在从库上使用CHANGE MASTER TO命令 并设置合适的值 大多数的值都是可选的 至少要指定需要改
  • C++数据结构笔记(8)循环链表实现

    1 循环链表与单链表的区别在于尾部结点存在指向头结点的指针 2 无论尾部结点指向第一个结点 头结点 还是第二个结点 第一个有效结点 都可以被称为循环链表 3 判断循环结束的两种方式 遍历次数等于size 或判断next指针是否指向头结点 4

随机推荐