Elasticseach的评分机制

lucene 的评分机制
elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的。评分就是我们搜索的短语和索引中每篇文档的相关度打分。
如果没有干预评分算法的时候,每次查询,lucene会基于一个评分算法来计算所有文档和搜索语句的相关评分。
使用lucene的评分机制基本能够把最符合用户需要的搜索放在最前面。
当然有的时候,我们可能想要自定义评分算法,这个就和lucene的评分算法没有什么关系了。当然,我们大多数应该还是会根据自己的需求,来调整lucene本身的算法。

lucene的评分公式
lucene的评分是叫做TF/IDF算法,基本意思就是词频算法。
根据分词词库,所有的文档在建立索引的时候进行分词划分。进行搜索的时候,也对搜索的短语进行分词划分。
TF代表分词项在文档中出现的次数(term frequency),IDF代表分词项在多少个文档中出现(inverse document frequency)。

lucene的算法简单来说就是将搜索的短语进行分词得出分词项,每个分词项和每个索引中的文档根据TF/IDF进行词频出现的评分计算。
然后每个分词项的得分相加,就是这个搜索对应的文档得分。

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

coord(q,d) 评分因子,基于文档中出现查询项的个数。越多的查询项在一个文档中,说明文档的匹配程度越高。
queryNorm(q)查询的标准查询
tf(t in d) 指项t在文档d中出现的次数frequency。具体值为次数的开根号。
idf(t) 反转文档频率, 出现项t的文档数docFreq
t.getBoost 查询时候查询项加权
norm(t,d) 长度相关的加权因子
coord(q, d)
这个评分因子的计算公式是:

public float coord(int overlap, int maxOverlap) {
    return overlap / (float)maxOverlap;
}
overlap: 文档中命中检索的个数
maxOverlap: 检索条件的个数
比如检索"english book", 现在有一个文档是"this is an chinese book"。
那么,这个搜索对应这个文档的overlap为1(因为匹配了book),而maxOverlap为2(因为检索条件有两个book和english)。
最后得到的这个搜索对应这个文档的coord值为0.5。

queryNorm(q)
这个因素对所有文档都是一样的值,所以它不影响排序结果。比如如果我们希望所有文档的评分大一点,那么我们就需要设置这个值。

public float queryNorm(float sumOfSquaredWeights) {
    return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
}
tf(t in d)
项t在文档d中出现的次数

public float tf(float freq) {
    return (float)Math.sqrt(freq);
}
比如有个文档叫做"this is book about chinese book", 我的搜索项为"book",那么这个搜索项对应文档的freq就为2,那么tf值就为根号2,即1.4142135

idf
public float idf(long docFreq, long numDocs) {
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
}
这里的两个值解释下

docFreq 指的是项出现的文档数,就是有多少个文档符合这个搜索
numDocs 指的是索引中有多少个文档。
我在用es实际看这里的时候遇到一个问题,numDocs数和实际的文档数不一致,最后弄明白了,这里的numDocs指的是分片的文档数据,而不是所有分片的文档数。
所以使用es分析这个公式的时候,最好将分片数设置为1。

比如我现在有三个文档,分别为:

this book is about english
this book is about chinese
this book is about japan
我要搜索的词语是"chinese",那么对第二篇文档来说,docFreq值就是1,因为只有一个文档符合这个搜索,而numDocs就是3。最后算出idf的值是:

(float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0) = ln(3/(1+1)) + 1 = ln(1.5) + 1 = 0.40546510810816 + 1 = 1.40546510810816

t.getBoost
查询时期项t的加权,这个就是一个影响值,比如我希望匹配chinese的权重更高,就可以把它的boost设置为2

norm(t,d)
这个项是长度的加权因子,目的是为了将同样匹配的文档,比较短的放比较前面。
比如两个文档:

chinese
chinese book
我搜索chinese的时候,第一个文档会放比较前面。因为它更符合"完全匹配"。

norm(t,d) = doc.getBoost()· lengthNorm· ∏ f.getBoost()

public float lengthNorm(FieldInvertState state) {
    final int numTerms;
    if (discountOverlaps)
        numTerms = state.getLength() - state.getNumOverlap();
    else
        numTerms = state.getLength();
    return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
}
这里的doc.getBoost表示文档的权重,f.getBoost表示字段的权重,如果这两个都设置为1,那么nor(t,d)就和lengthNorm一样的值。

比如我现在有一个文档:

chinese book
搜索的词语为chinese, 那么numTerms为2,lengthNorm的值为 1/sqrt(2) = 0.71428571428571。

但是非常遗憾,如果你使用explain去查看es的时候,发现lengthNorm显示的只有0.625。
这个官方给出的原因是精度问题,norm在存储的时候会进行压缩,查询的时候进行解压,而这个解压是不可逆的,即decode(encode(0.714)) = 0.625。

示例
es中可以使用_explain接口进行评分解释查看。

比如现在我的文档为:

chinese book
搜索词为:

{
  "query": {
    "match": {
      "content": "chinese"
    }
  }
}
explain得到的结果为:

{
    "_index": "scoretest",
    "_type": "test",
    "_id": "2",
    "matched": true,
    "explanation": {
        "value": 0.8784157,
        "description": "weight(content:chinese in 1) [PerFieldSimilarity], result of:",
        "details": [
            {
                "value": 0.8784157,
                "description": "fieldWeight in 1, product of:",
                "details": [
                    {
                        "value": 1,
                        "description": "tf(freq=1.0), with freq of:",
                        "details": [
                            {
                                "value": 1,
                                "description": "termFreq=1.0"
                            }
                        ]
                    },
                    {
                        "value": 1.4054651,
                        "description": "idf(docFreq=1, maxDocs=3)"
                    },
                    {
                        "value": 0.625,
                        "description": "fieldNorm(doc=1)"
                    }
                ]
            }
        ]
    }
}
看到这篇文档的总得分为 0.8784157

tf(t in d): 1
idf: ln(3/(1+1)) + 1 = 1.4054651
norm(t,d): decode(encode(1/sqrt(2))) = 0.625
总分: 1.4054651 * 0.625 = 0.8784157
时间: 2024-11-06 03:37:54

Elasticseach的评分机制的相关文章

Solr In Action 笔记(2) 之 评分机制(相似性计算)

Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 <这就是搜索引擎>里面对相似性计算进行了简单的介绍. 内容的相似性计算由搜索引擎的检索模型建模,它是搜索引擎的理论基础,为量化相关性提供了一种数学模型,否则没法计算.当然检索模型理论研究存在理想化的隐含假设,即假设用户需求已经通过查询非常清晰明确地表达出来了,所以检索模型的任务不牵扯到对用户需求建模,但实际上这个和实际相差较远,即使相同的查询词,不同用户的需求目的可能差异很大,而检索模型对此无能为力.几种常见的检索模

Lucene Scoring 评分机制

原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分.它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene.但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制. Lucene scoring 组合使用了 信息检索的向量空间模型 和 布尔模型 . 首先来

Lucene 的 Scoring 评分机制

转自: http://www.oschina.net/question/5189_7707  Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分.它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene.但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制. Lucene scoring 组合使用了 信 息检索的向量空间模型 和 布尔模型 . 首先来看下 lucene 的评分公式(在 Sim

lucene 评分机制研究

评分公式 1.coord(q,d),查询覆盖率 /** Implemented as <code>overlap / maxOverlap</code>. */ @Override public float coord(int overlap, int maxOverlap) { return overlap / (float)maxOverlap; } 例如: 查询:query=title:search and content:lucenen 确定最大覆盖maxOverlap =

信用评分中的评分卡中的A卡、B卡和C卡

A卡(Application score card)申请评分卡 B卡(Behavior score card)行为评分卡 C卡(Collection score card)催收评分卡 评分机制的区别在于: 1.使用的时间不同.分别侧重贷前.贷中.贷后: 2.数据要求不同.A卡一般可做贷款0-1年的信用分析,B卡则是在申请人有了一定行为后,有了较大数据进行的分析,一般为3-5年,C卡则对数据要求更大,需加入催收后客户反应等属性数据. 3.每种评分卡的模型会不一样.在A卡中常用的有逻辑回归,AHP等

基于业务规则的客户风险评分 – IBM ODM实现

通常的业务规则我们使用If then的形式来描述,而现实生活中的企业业务决策要复杂得多,一般由多个规则组成,而且其复杂性很难直接通过经典的基于rete的规则引擎利用其推理能力执行多个if then语句来解决.需要对规则流的设计,模型的建立,规则的层次结构有一个整体的考虑设计,以真正达到企业运营决策逻辑的敏捷变更的目的. 本文将使用一个金融行业常见的客户风险评分场景,来说明怎么利用业务规则技术(IBM ODM/JRules)实现复杂决策. 客户风险评分需求 所谓客户风险评分,就是根据客户信息使用特

电影评分那些事

电影评分现在是一个很普遍的事情了.我自己作为一个小影迷,一直都想写一篇关于电影评分,或者说影视评论的文章,今天终于有时间坐下来好好整理一下思绪了.我要写的方面主要有三个:目前的流行的评分机制与评分网站:严肃的电影评论&大众评分:我自己的评分体系. 一.目前流行的评分机制与评分网站 目前比较流行的评分网站,国外主要有IMDb,Metacritic,还有Rotten Tomatoes(烂番茄),这是三大主流的评分网站.我自己比较关注的还有Letterboxd,这个网站适合影迷使用,现在用的人也比较多

投票证明:基于投票机制和联盟封锁链的高性能一致性协议

Title:投票证明:基于投票机制和联盟封锁链的高性能一致性协议 Abstract:比特币引入了一种革命性的去中心化共识机制.然而,应用于公共区块链的比特币衍生共识机制不适合新兴联盟区块链的部署场景.我们提出了一种新的共识算法,即投票证明(POV).协商一致由联合体合作伙伴控制的分布式节点协调,这些节点将通过投票进行分散仲裁.关键的想法是为网络参与者建立不同的安全身份,以便在不依赖第三方中介或无法控制的公众意识的情况下,由机构在联盟中的投票决定提交和验证区块.与完全分散的一致性工作证明(POW)

华为软件精英挑战赛2016题解

代码:https://github.com/jinhang/2016_Huawei_SoftWareMatch 前言 赛题源自"未来网络"业务发放中的路由计算问题.算路问题属于基础算法问题,在图论.网络.交通等各个方面均有着广泛的研究与运用,里面不乏一些经典的算法,例如最短路中的广度优先搜索,Dijkstra算法等.网络算路问题的更优算法实现对于网络资源高效配置具有重要价值. 本次大赛分为初赛.复赛和总决赛三个主要阶段,当前为总决赛/复赛阶段. 总决赛/复赛赛题描述 1 问题定义 给定