elasticsearch系列(五)score
概述
score在ES中有着很重要的作用,有了它才有了rank,是验证文档相关性的关键数据,score越大代表匹配到的文档相关性越大
官方解释
查询的时候可以用explain来展示score的计算过程,也可以增加format=yaml来讲json转成yaml方便阅读
类似xxx/_search?explain&format=yaml
下图是通过explain看到的一部分json,其实这个解释中就展示出了计算公式,不得不说ES在这点上还是很人性化的
计算方式
常说的相关性是指计算一个全文(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之间的对比
TF-IDF和BM25对比
在TF角度的对比
计算流程
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,顾名思义,是先查询后获取。
查询流程如下
score as percentage
刚接触score的时候,总有疑惑,为什么不是一个百分比,这样可能更加直观的表现出匹配到正确的概率,也就是术语”normalized socre”。
这么想是错误的!
Score的意义仅仅在于对比一次查询的多个结果的对比,起到rank作用,并不能代表匹配到的概率,更不能拿几个匹配到的概率做比较,比如:当一个document本身没有发生变化,但是index发生变化,就会影响匹配到document的sorce。这样的概率是没什么意义的,虽然你可以强行造出一个概率。
另外
在做业务的过程中领悟到,搜索系统和推荐系统不是一个系统(之前没想过这个问题),重要区别之一就是主动和被动,详细看这篇博客吧,说的很详细了
http://blog.csdn.net/cserchen/article/details/50422553
参考资料
//官方对相关性的解释,也就是score的计算标准
https://www.elastic.co/guide/en/elasticsearch/guide/master/relevance-intro.html
//当你的数据很少时,请用DFS Query Then Fetch搜索方法
https://www.elastic.co/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch
//ES的两个搜索方法
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html
//ES官方解释的BM25和TF-IDF区别
https://www.elastic.co/blog/found-similarity-in-elasticsearch
//外国友人对BM25和TF-IDF的解读
http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/
//外国友人吐槽 当score变成percentage的后果
https://wiki.apache.org/lucene-java/ScoresAsPercentages
elasticsearch系列(五)score的更多相关文章
- elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)
一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...
- Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解
Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...
- ElasticSearch第五步-.net平台下c#操作ElasticSearch详解
前面我们讲解了关于ElasticSearch的安装配置,以及CRUD 本章我将讲解怎么使用c#操作ElasticSearch. 首先你需要一定的技术储备,比如:asp.net webapi,mvc,j ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- 系列五AnkhSvn
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...
随机推荐
- uoj#228 基础数据结构练习题
题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...
- Attribute注解
class Program { static void Main(string[] args) { //Attribute注解,Attribute是附加到方法.属性.类等上面的特殊的标签,在类Type ...
- JQuery实现通过点击标题切换字体
这个主要通过判断被点击的元素的子元素中是否包含了b元素来进行字体的切换,其中wrapInner函数是为了在$author元素的内部添加b标签. 切换回正常字体是通过将内容转化为纯文本形式,再替换元素内 ...
- TypeScript入门-泛型
泛型 要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,TypeScript提供了一个很好的方法:泛型 Hello World 要兼容多种数据格式,可能会有人想到any,即 ...
- cmd 命令行模式操作数据库 添加查询 修改 删除 ( 表 字段 数据)
一 查看数据库.表.数据字段.数据 1 首先配置环境变量 进入mysql 或者通过一键集成工具 打开mysql命令行 或者mysql 可视化工具 打开命令行 进入这样的界面 不同的机器操作不同 ...
- IOS的UITableView
UITableView 概述 UITableView 一般用来展示表格数据.可以滚动(继承自UIScrollView).性能极佳 UITableView分两种样式: Plain,不分组的样式 Grou ...
- vlan内部与外部某终端之间的通信
实现虚拟局域网外部终端与内部终端之间的通信,即实现pc3与pc1和pc4之间的通信. 把交换机上的默认VLAN1改成VLAN2(红色字体命令). 各vlan内部终端的通信,是通过vlan ID来实现的 ...
- hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...
- su 切换用户的提示"This account is currently not available"
su 切换ivalue用户时,提示"This account is currently not available"; 首先进入/etc/passwd文件中是否添加ivalue用户 ...
- VR全景是市场价值及前景
消费者视角痛点:比如酒店消费行业,很多消费者在预订酒店过程中,都遇到过这样的场景:网上照片里酒店房间看着宽敞明亮,格调不凡,感觉非常喜欢,等真正推开房门插上房卡一看,却大失所望.在酒店行业,网上照片和 ...