当我们能使用match来搜索匹配数据的时候,es会给每一个文档进行评分(匹配度),并根据评分的大小对结果文档进行排序。

介绍

es的实时评分机制是基于 Lucene 的基础上实现的,最常见的是 TF/IDFBM25这两种评分模型。

TF-IDF属于向量空间模型,而BM25属于概率模型,但是他们的公式可能并没有你想象的那么大差距。两种相似度模型都使用idf方法和tf方法的某种乘积来定义单个词项的权重,然后把和查询匹配的词项的权重相加作为整篇文档的分数。

对于这两种算法的详细介绍以及区别大家可以参考:

  1. https://en.wikipedia.org/wiki/Okapi_BM25
  2. https://en.wikipedia.org/wiki/Tf–idf

在es5.0版本之前使用了TF/IDF算法实现,而在5.0之后默认使用BM25方法实现。

作为开发,我们可以不需要了解非常深入的了解公式的由来,但也要做到公式的组成和每个参数的含义。

例子

下面是一个普通的查询:

PUT /test/test1/1
{"title":"hallo,books"}
PUT /test/test1/2
{"title":"hallo,books boy"}
PUT /test/test1/3
{"title":"hallo hallo,hi hi hi hi"}
PUT /test/test1/4
{"title":"hallo hallo,hi hi hi hi"}
PUT /test/test1/5
{"title":"hi hi hi hi"}GET /test/test1/_search
{"query": {"match": {"title": "hallo hi"}}
}

在搜索的结果中有一个_score字段,代表了es给文档的评分,默认的排序规则是根据这个字段的大小进行排序,越大则出现在越前面。

当我们搜索一个单词或者一个词组乃至一句话的时候,es先会通过Analyzer分析器拆成多个term(ES学习——分析器和自定义分析器),然后在对每一个term进行BM25公式评分,最后把每一个term的评分进行加权求和,就是最后的得分。

例如,我们搜索hallo hi,es通过对应的默认解析器拆分成hallohi,分别求出分数score(hallo)和score(hi):
总得分Score=score(hallo)+score(hi)。

和sql相似,我们可以通过在搜索条件中添加explain=true,来查看具体的得分过程。

GET /test/test1/_search?explain=true
{"query": {"match": {"title": "hallo hi"}}
}##以下通过筛选,过滤了一些无用的信息{"_shard": "[test][0]",【1】"_score": 1.202173,【2】"_source": {"title": "hallo hallo,hi hi hi hi"【3】},"_explanation": {"value": 1.202173,"description": "sum of:",【4】"details": [{"value": 0.3530123,【5】"description": "weight(title:hallo in 2) [PerFieldSimilarity], result of:","details": [{"value": 0.3530123,【7】"description": "score(doc=2,freq=2.0 = termFreq=2.0\n), product of:","details": [{"value": 0.2876821,"description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:","details": [{"value": 4,"description": "docFreq"},{"value": 5,"description": "docCount"}]},{"value": 1.2270917,【8】"description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:","details": [{"value": 2,"description": "termFreq=2.0"},{"value": 1.2,"description": "parameter k1"},{"value": 0.75,"description": "parameter b"},{"value": 4.2,"description": "avgFieldLength"},{"value": 6,"description": "fieldLength"}]}]}]},{"value": 0.84916073,【6】"description": "weight(title:hi in 2) [PerFieldSimilarity], result of:"##省略和 hallo的计算方式类似}]}}

从最外层结构往里分析:
【1】:代表文档的分片,[test][0],在es中每一个分片评分都是单独计算的
【2】【3】:代表最后的分数和文档
【4】:总的分数是1.202173,sum of是默认的加权平均,把hallo的分数(0.3530123)+hi的分数(0.84916073)
【5】【6】:分表表示hallo的评分和hi的评分。其description描述的很明白:weight(title:hallo in 2)
【7】【8】:hallo的评分是由【7】(idf)*【8】(tfNorm)得出
【7】:idf(下面介绍)=log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5))
【8】:tfNorm=(freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))

公式介绍(BM25)

归纳一下上面的公式:
score=Σ(IDF∗tfNorm)score = \Sigma(IDF*tfNorm) score=Σ(IDF∗tfNorm)
参考,BM25与TF/IDF的区别

IDF (inverse document frequency):逆文档频率,是指一个词在文档中出现的次数越多,则他的权值相对越多。例如常用的词and 或 or 或 a在文档中出现的次数非常多,相对于用户而言重要性很小,但是elasticSearch等不常见的词进行搜索的时候相对于用户来说,权重应该更大。

IDF

在_explanation中也已经写明了IDF的计算公式:
IDF=log⁡(1+(docCount−docFreq+0.5)docFreq+0.5)IDF = \log(\frac{1 + (docCount - docFreq + 0.5)}{docFreq + 0.5}) IDF=log(docFreq+0.51+(docCount−docFreq+0.5)​)

其中docCount代表该分片总的文档数量数量,docFreq代表有这个分词的文档数量。
在例子中,总共的文档数为5,包含hallo的文档数为4,所以docFreq=4,docCount=5。IDF最终算出来为0.2876821,且在同一分片中所有的文档的IDF且相同。

tfNorm

tfNorm代表此term在此文档中的重要程度,在此doc中出现次数越多,越重要;并且文档的长度越短,也见解说明改term在此doc中越重要。
具体公式:
tfNorm=freq∗(k1+1)freq+k1∗(1−b+b∗fieldLengthavgFieldLength)tfNorm=\frac{freq * (k1 + 1)} {freq + k1 * (1 - b + b * \frac{fieldLength}{avgFieldLength})} tfNorm=freq+k1∗(1−b+b∗avgFieldLengthfieldLength​)freq∗(k1+1)​

其中:
freq:在文档中出现的次数
k1:为调优参数,固定值,默认1.2,合理的值需要依赖文档的数据。
b:为调优参数,固定值,默认为0.75,合理的值需要依赖文档的数据。
fieldLength:是满足查询条件的doc的filed的长度
avgFieldLength:是满足查询条件的所有doc的filed的长度.

注意点

评分都是以分片为单位的,若两个文档分布在不同的分片,会出现即使内容完全相同但是分数有差异的情况(IDF的docCount和docFreq有区别)或者出现更加符合我们心里预期的文档分数反而较低的情况。

方案:

  1. 把结构相似的文档通过route到一个分片上。个人认为若文档种类差异较大可以使用这种方法,但是会出现分片数据不均匀的问题。
  2. 自定义评分处理。有公式看出IDF只与出现次数和文档总数有关,在一个分片中,次数和文档总数是固定的,在全局中也是一样。 设置忽略IDF。 但是这种方法,在多个term查询的时候,相当于忽略了IDF对分数的影响。
  3. 业务上可以容忍,不做修改。当文档的基数很大,且文档分配很均匀的时候,两个相同的文档分数的差异会相对减少。

ES学习——ES评分简单介绍相关推荐

  1. 【贪玩巴斯】Unity3D初学圣经(一)——学习要求 Unity简单介绍 游戏引擎介绍 课程体系介绍 「1-1 到 1-4 」—— 2021年12月9日

    Unity3D初学圣经 一 --学习要求 & Unity简单介绍 & 游戏引擎介绍 & 课程体系介绍 本文对应视频P1 1-1 到P2 1-4 1.学习要求 2.Unity简单 ...

  2. salesforce lightning零基础学习(一) lightning简单介绍以及org开启lightning

    lightning对于开发salesforce人员来说并不陌生,即使没有做过lightning开发,这个名字肯定也是耳熟能详.原来的博客基本都是基于classic基于配置以及开发,后期博客会以ligh ...

  3. JMS学习(2):ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  4. 云计算开发学习教程,简单介绍云计算

    从专业的角度来说,云计算指的是一种计算模型,允许无处不在地.方便地.按需地通过网络访问共享可配置的计算资源,如网络.服务器.存储.应用和服务等,这些资源以服务形式快速供应和发布,使相应的软硬件资源的管 ...

  5. AJAX学习基础:简单介绍数据岛使用方法

        数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml, 对xml编写脚本.     数据岛有它特有的形式,由标记xml开始 ...

  6. OpenSL ES与AAudio简单介绍

    原因:在耳返功能时,如果使用AudioRecord和AudioTrack进行采集与播放会造成延迟问题,故需要涉及到openSL ES与AAudio的使用. 概况:OpenSL ES与AAudio简单理 ...

  7. ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式

    1.什么是ES **ES** 全称 **ElasticSearch** 是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来. Lucene是公认的迄今为止的最好用的搜索引擎库,但是他所 ...

  8. ES学习看这一篇文章就够了

    第一章 ES简介 第1节 ES介绍 1 2 3 4 1.Elasticsearch是一个基于Lucene的搜索服务器 2.提供了一个分布式的全文搜索引擎,基于restful web接口 3.Elast ...

  9. Elasticsearch(一) ES之简介、倒排索引介绍以及 elasticsearch、kibana安装

    1,什么是Elasticsearch Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearc ...

最新文章

  1. SAP WM 2-Step Picking的TO单据特殊的地方
  2. 区块链100讲:智能合约审计指南
  3. Swift和Objective-C混编注意事项
  4. JS 创建对象的七种方式
  5. 测试人员未来的3条出路
  6. LeetCode 528. 按权重随机选择(前缀和+二分查找)
  7. 写给《我也能做CTO》作者的一封信
  8. ftp服务器多用文件夹权限,自己动手搭建隔离用户的FTP服务器之权限分配(二)...
  9. 方案分享丨基于海思Hi3519智能 IP 摄像机解决方案
  10. MTSP问题遗传算法解决代码及其案例
  11. c语言步长,(转+原创)c语言那些细节之a+1和a+1的区别 ,指针的步长问题。
  12. flutter 应用 adb shell input swipe 命令失效
  13. 炮兵阵地(状态压缩)
  14. 目标检测里,视频与图像有何区别?
  15. 安卓9.0设置以太网静态IP地址
  16. vb ajax提交post,使用jQuery AJAX将JS数组传递给VB.Net post
  17. [新手踩坑]k8s部署遇到的问题及可参考的解决办法
  18. 嵌入式菜单LCD简单版
  19. 关于网盘等图标出现在设备和驱动器的情况
  20. jsTree API文档(中文)

热门文章

  1. TimFin金融数据系统开发-软件工程部分(springboot+vue)
  2. 【论文阅读|浅读】PGE:A Representation Learning Framework for Property Graphs
  3. Windows11修改文件后缀名的方法
  4. CutMix原理与代码解读
  5. TBOX定位测试-如何用Excel分析对比RTK数据
  6. Speckle Revit连接器使用教程
  7. java - jinfo jvm配置信息工具
  8. 网上下载的资源是压缩包文件,有密码怎么办?
  9. PHP类 const常量访问方法例子
  10. 【转】一个字节可以用多少位的十六进制表示