转自: http://www.oschina.net/question/5189_7707

Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分。它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene。但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制。

Lucene scoring 组合使用了 信 息检索的向量空间模型 和 布尔模型 。

首先来看下 lucene 的评分公式(在 Similarity 类里的说明)

其中:

  1. tf(t in d) 关联到项频率,项频率是指 项 t 在 文档 d 中出现的次数 frequency。默认的实现是:

    tf(t in d) =frequency½

  2. idf(t) 关联到反转文档频率,文档频率指出现 项 t 的文档数 docFreq。docFreq 越少 idf 就越高(物以稀为贵),但在同一个查询下些值是相同的。默认实现:

  3. coord(q,d) 评分因子,是基于文档中出现查询项的个数。越多的查询项在一个文档中,说明些文档的匹 配程序越高。默认是出现查询项的百分比。
  4. queryNorm(q)查询的标准查询,使不同查询之间可以比较。此因子不影响文档的排序,因为所有有文档 都会使用此因子。默认值:

    每个查询项权重的平分方和(sumOfSquaredWeights)由 Weight 类完成。例如 BooleanQuery 地计算:

  5. t.getBoost()查询时期的 项 t 加权(如:java^1.2),或者由程序使用 setBoost()。
  6. norm(t,d)压缩几个索引期间的加权和长度因子:
    • Document boost - 文档加权,在索引之前使用 doc.setBoost()
    • Field boost - 字段加权,也在索引之前调用 field.setBoost()
    • lengthNorm(field) - 由字段内的 Token 的个数来计算此值,字段越短,评分越高,在做索引的时候由 Similarity.lengthNorm 计算。

    以上所有因子相乘得出 norm 值,如果文档中有相同的字段,它们的加权也会相乘:

索引的时候,把 norm 值压缩(encode)成一个 byte 保存在索引中。搜索的时候再把索引中 norm 值解压(decode)成一个 float 值,这个 encode/decode 由 Similarity 提供。官方说:这个过程由于精度问题,以至不是可逆的,如:decode(encode(0.89)) = 0.75。

计算这个评分涉及到几个核心的类/接口:Similarity、Query、Weight、Scorer、Searcher,由它们或其子类来完成 评分的计算。先来看下它们   的类图:

lucene search score uml, 点击放大

搜索中,评分的过程:

  1. 创建一个查询对象 Query,传给 Searcher,具体来讲可能是 IndexSearcher。
  2. Searcher 根据 Query 创建一个对应的 Weight(是 Query 的内部特征表示),接着 Weight 会创建对应的 Scorer。
  3. Searcher 会创建 Hitcollector 并传到 Scorer,scorer 找到匹配的文档并计算评分,最后写到 Hitcollector 中。

Query、Weight、Scorer 三都关系十分密切,尤其是 Query 和 Weight。Weight 是计算查询权重和创建 Scorer 的。Query 为了可以重用把内部的特征抽象为 Weight,由子类去完成一些相关评分的计算。

任何 Searcher 依赖的状态都存储在 Weight 实现中,而不是在Query 中,这样可以重用 Query。

Weight 的生命周期(被使用):

  1. Weight 由顶层的 Query 创建。Query.createWeight(Searcher),创建的 Weight 给 Searcher 去使用。
  2. 当用 Similarity.queryNorm(float) 来计算查询标准化因子(query normalization)的时候,Weight.sumOfSquaredWeights() 会被调用。
  3. 查询标准化因子(query normalization)会传给 Weight.normalize(float)计算,这个时候权重(weighting)计算完成。
  4. 创建一个 Scorer。

自定义评分的计算

可以实现一个 Similarity 换掉默认的。它仅限于 Scorer、Weight 计算好的因子值再加工。要想对评分有更强的控制力,可以实现一套 Query、Weight、Scorer。

  • Query 是用户信息需要的抽象
  • Weight 是 Query 的内部特性表示的抽象
  • Scorer 抽象公用的计算评分功能,提供计算评分和解说(explanation)评分的能力。

Query 子类实现的方法:

  1. createWeight(Searcher searcher) -- Weight 是 Query 内部代表,所以每个 Query 都必实现一个 Weight,此方法就是生成一个Query对应的Weight对象。
  2. rewrite(IndexReader reader) -- 重写查询为原始的查询,原始的查询有:TermQuery,BooleanQuery……

Weight 接口方法:

  1. Weight#getQuery() -- 指出代表 Weight 的 Query。
  2. Weight#getValue() -- Query 的权重,例如:TermQuery.TermWeight 的 value = idf^2 * boost * queryNorm
  3. Weight#sumOfSquaredWeights() -- 各查询项的平方和,如,TermWeight 的 = (idf * boost)^2
  4. Weight#normalize(float) -- 决定查询标准化的因子,查询标准化值可以在不同 Query 比较 score
  5. Weight#scorer(IndexReader) -- 创建 Query 对应的评分器 Scorer,它的责任是给 Query 匹配到的文档评分。
  6. Weight#explain(IndexReader, int) -- 给指定的文档详细解说评分值是怎么得来了。

Scorer 子类实现的方法:

  1. Scorer#next() -- 预取匹配到的下一文档,有才返回 true。
  2. Scorer#doc() -- 返回当前匹配到的文档id,它必须 next() 调用后才有效。
  3. Scorer#score() -- 返回当前文档的评分,此值可以由应用程序以任何适当的方式给出,如 TermScorer 返回 tf * Weight.getValue() * fieldNorm
  4. Scorer#skipTo(int) -- 跳到大于或等于 int 的匹配文档上。很多情况下,在结果集中 skipTo 比较循环更加快速高效。
  5. Scorer#explain(int) -- 给出评分产生的细节。

要实现一套 Query、Weight、Scorer,最好还是看下 TermQuery、TermWeight、TermScorer。

当 Lucene 中没有想要的查询时(包括不同的评分细节),自定义Query 可能帮得上忙。

转载于:https://www.cnblogs.com/vincent2010/p/4771215.html

Lucene 的 Scoring 评分机制相关推荐

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

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

  2. Apache Nutch 1.3 学习笔记十一(页面评分机制 LinkRank 介绍)

    下面是Google翻译的http://wiki.apache.org/nutch/NewScoring内容,是关于Nutch 新的链接分数算法的说明,有点类似于Google的PageRank,这里有其 ...

  3. (一百九十六)Android Q 学习WiFi的评分机制(三)

    前言:之前在(一百九十六)Android Q 学习WiFi的评分机制(二)梳理了CS对WiFi score变化的处理,主要是rematchAllNetworksAndRequests方法中的处理,其中 ...

  4. Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据

    Android可以支持:移动数据网络.WIFI.蓝牙.网线等,这些连接本身都可以独立使用,连接管理通过一个评分机制来实现不同接入方式的选择.具体来说就是,每一种上网方式在初始化时,都向Connecti ...

  5. 逆水寒捏脸服务器维护,《逆水寒》优化热门服务器排队体验 捏脸颜值评分机制优化...

    2) 整容时,新增了一个[还原修改]按钮,点击可以将本次在捏脸界面的操作都清除,还原为整容前的容颜. 3) 颜值评分机制优化,发型.妆容等部分也加入评判范围 3. "倚竹袖长寒卷翠,凌波袜小 ...

  6. 【安卓Framework学习】Wifi框架学习之热点评分机制

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  7. Python:实现scoring评分算法(附完整源码)

    Python:实现scoring评分算法 def procentual_proximity(source_data: list[list[float]], weights: list[int] ) - ...

  8. android网络的评分机制、连接国内ap wifi不回连问题

    前言: 本文介绍了android下网络的评分机制,同时分析wifi连接国内ap时,重新打开wifi后,wifi不回连ap的问题,并提供解决方法. android下可以有多种网络存在,如:wifi.mo ...

  9. Android Framework层播放器评分机制

    本文涉及源码版本为:Oreo 8.0.0_r4 /frameworks/av/media/libmedia/mediaplayer.cpp /frameworks/av/include/media/m ...

  10. [RK3288][Android6.0] WiFi之NetworkFactory形成的评分机制

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 NetworkFactory作为网络评分机制中一个重要角色而存在,每个模块实现需要继承Networ ...

最新文章

  1. 关于NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
  2. 【NLP】 深度学习NLP开篇-循环神经网络(RNN)
  3. Win32 SDK 编写截图小工具
  4. csv 字符串_Python实现json转csv格式
  5. ATL--创建简单的ATL之dll工程,给接口添加属性(实际上就是一个函数对)
  6. [Luogu] P4626 一道水题 II
  7. oracle 表收缩,Oracle 收缩表大小 Oracle Shrink Table
  8. inDesign教程,如何创建、修改和使用母版页?
  9. 回溯策略的汉诺塔问题
  10. 伺服驱动伺服电机选型究竞有哪些问题要注意??
  11. mac 无法对计算机进行更改,解析深度技术win10 MAC不能修改的原因和解决成功的技巧...
  12. exlc表格怎么换行_excel表格怎么设置文字自动换行
  13. 五个最佳FTP客户端工具
  14. Linux Shell发邮件笔记
  15. Vue项目实践——实现手机扫描二维码预览页面效果
  16. Linux中将4块10T新硬盘合并成一个,挂载到Resource目录下
  17. 数控机床需要c语言程序吗,数控机床的编程有几种方法?
  18. 城市中心、华为、软通动力智慧城市联合解决方案发布
  19. 将pdf转换成图片在转换回pdf文件
  20. 测试用例是什么?怎么写?最好实用的测试用例

热门文章

  1. abcde依次进入一个队列_体育老师必看——详解队列队形及口令(2)
  2. A Detailed Explanation of the Detection and Processing of BigKey and HotKey in Redis
  3. springmvc application/octet-stream 问题
  4. mac docker nginx 配置
  5. Prototype使用$F()函数
  6. phpMyAdmin源码配置过程
  7. 迁移学习——数据不够的情况下训练深度学习模型
  8. smartsvn 8.6.6 for linux 的安装与破解
  9. 跨域cookie设置
  10. 华为网赛存储基础原理自测答案