`
zhanshenny
  • 浏览: 265020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene Scoring 评分机制[转]

阅读更多
Lucene Scoring 评分机制
发表于:2009年8月26日 | 分类:Search | 标签: lucene, score | views(3,075)
版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.


原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html

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

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

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

score(q,d)   =   coord(q,d) ·  queryNorm(q) · ∑ ( tf(t in d) ·  idf(t)2 ·  t.getBoost() ·  norm(t,d) )
t in q 


其中:

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


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


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





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

sumOfSquaredWeights =   q.getBoost() 2 · ∑ ( idf(t) ·  t.getBoost() ) 2
t in q


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

norm(t,d)   =   doc.getBoost() ·  lengthNorm(field) · ∏ f.getBoost()
field f in d named as t 

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

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


lucene search score uml, 点击放大

搜索中,评分的过程:

创建一个查询对象 Query,传给 Searcher,具体来讲可能是 IndexSearcher。
Searcher 根据 Query 创建一个对应的 Weight(是 Query 的内部特征表示),接着 Weight 会创建对应的 Scorer。
Searcher 会创建 Hitcollector 并传到 Scorer,scorer 找到匹配的文档并计算评分,最后写到 Hitcollector 中。
Query、Weight、Scorer 三都关系十分密切,尤其是 Query 和 Weight。Weight 是计算查询权重和创建 Scorer 的。Query 为了可以重用把内部的特征抽象为 Weight,由子类去完成一些相关评分的计算。

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

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

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

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

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

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

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

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

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

重要参考资料:
[url]
http://lucene.apache.org/java/2_4_1/scoring.html[/url]
http://lucene.apache.org/java/2_4_1/api/org/apache/lucene/search/package-summary.html#scoring
http://lucene.apache.org/java/2_4_1/api/org/apache/lucene/search/Weight.html
分享到:
评论
1 楼 chenwq 2012-02-02  
http://www.oschina.net/question/5189_7707

相关推荐

    Lucene 评分机制

    在Lucene中,评分机制(Scoring Mechanism)就是用于决定文档与查询匹配程度的关键部分,它决定了哪些文档应该排在搜索结果的前面。 Lucene 的核心是倒排索引,这种数据结构使得能够快速定位到包含特定词项的文档。...

    Lucene5学习之评分Scoring

    在Lucene 5版本中,对于搜索结果的排序和评分机制进行了优化,使得搜索体验更加精准。本文将深入探讨Lucene5中的评分(Scoring)机制,帮助读者理解如何通过源码分析和工具使用来提升搜索质量。 首先,我们需要了解...

    lucene例子手写

    Lucene 使用评分机制(TF-IDF)来衡量文档与查询的相关性。 4. **排序和高亮(Scoring and Highlighting)**:根据评分对搜索结果进行排序,并可以对匹配的查询词进行高亮显示,提升用户体验。 5. **更新和删除...

    lucene站内搜索

    4. **评分(Scoring)**: Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)算法计算每个匹配文档的相关性分数。 5. **结果排序(Resuliting Sorting)**: 按照评分从高到低排序搜索结果,返回给用户...

    Lucene实战源码(Lucene in Action Source Code)part1

    执行查询时,Lucene会使用索引来查找匹配的文档,并根据评分函数(Scoring Function)为每个匹配的文档打分。TF-IDF(Term Frequency-Inverse Document Frequency)是常见的评分算法,它结合了词频和文档频率来衡量...

    lucene源码和程序

    7. **评分(Scoring)**:Lucene根据文档与查询的相关性给出评分,用于排序搜索结果。TF-IDF(Term Frequency-Inverse Document Frequency)是常用的评分算法。 8. **更新与删除(Update & Delete)**:一旦索引...

    lucene 5.4.1 官方文档离线版

    - **Scoring**: Lucene的评分机制,基于TF-IDF等算法评估文档的相关性。 3. **高级特性**: - **MultiFieldQueryParser**:允许在一个Document的多个Field中进行搜索。 - **Filter**和**QueryWrapperFilter**...

    lucene-4.7.0.zip

    5. 排序与评分(Sorting & Scoring):根据相关性对搜索结果进行排序,评分机制决定了哪些结果更为重要。 四、Lucene的使用 1. 创建索引:首先,需要将待搜索的数据通过Analyzer进行预处理,然后创建Document对象...

    lucene全文检索教程

    接着,Lucene提供了多种评分机制(Scoring Mechanisms)来决定文档与查询的相关性。TF-IDF(Term Frequency-Inverse Document Frequency)是最常用的评分方法,它基于词频和文档频率来计算每个文档的得分。此外,还...

    Lucene索引和查询

    - 匹配评分(Scoring):Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)或其他评分算法,计算每个文档与查询的相关性。 - 结果排序(Sorting):根据评分对匹配到的文档进行排序,返回最相关的文档...

    Lucene.Net 2.0 源码+文档

    TF-IDF模型是默认的评分算法,但也可以通过自定义ScoreComputation类来实现其他评分机制。 8. **扩展性与可定制化**:Lucene.Net具有良好的模块化设计,开发者可以通过继承和实现接口来扩展其功能,例如自定义分词...

    lucene 代码

    - **评分(Scoring)**:根据文档的相关性对搜索结果进行排序。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的评分算法。 - **结果集**:返回给用户最相关的搜索结果。 3. **源代码解析**: ...

    lucene4.6.0 jar包

    4. **文档评分(Document Scoring)**: Lucene 使用 TF-IDF(Term Frequency-Inverse Document Frequency)算法计算文档的相关性,4.6.0 版本对此进行了优化,提升了搜索结果的质量。 **三、使用步骤** 1. **创建...

    lucene3.0 search

    2. 匹配评分(Scoring):Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)算法计算每个文档与查询的相关性,得分越高,相关性越强。 3. 排序与剪枝(Ranking and Pruning):根据评分对匹配的文档...

    lucene3.5源码

    评分机制基于TF-IDF模型,评估关键词在文档中的重要性。 3. 结果集排序(Scoring):根据评分对搜索结果进行排序,评分最高的文档优先展示。 四、高级特性 1. 分块索引(Compound File Format, CFS):Lucene 3.5...

    lucene 7.3源码

    6. **评分机制(Scoring)** Lucene采用TF-IDF算法进行评分,同时支持自定义评分函数。TF(Term Frequency)衡量一个词在文档中的重要性,IDF(Inverse Document Frequency)则考虑词在整个文集中的普遍性。 7. **...

    lucene 实现类似百度搜索

    5. **评分(Scoring)**:Lucene 会计算每个文档的相关性分数,作为排序依据。 6. **自定义分析器(Custom Analyzers)**:根据需求调整分词规则、过滤特殊字符等。 7. **多字段搜索(Multi-Field Search)**:同时...

    非常详细的Lucene文档

    2. **排序与评分(Sorting & Scoring)**: Lucene 支持基于相关性的排序,通过 TF-IDF(Term Frequency-Inverse Document Frequency)等算法计算文档的相关度。 3. **多字段搜索(Multi-Field Searching)**: 用户...

    Lucene 3.0 原理

    5. **评分系统(Scoring)**:Lucene 使用TF-IDF(词频-逆文档频率)算法来计算文档的相关性分数。TF-IDF 考虑了术语在单个文档中的出现频率(TF)以及在整个索引中的分布(IDF),以确定哪些文档与查询更相关。 6....

    lucene索引简单介绍

    6. **评分(Scoring)**:Lucene根据相关性对搜索结果进行评分。TF-IDF(Term Frequency-Inverse Document Frequency)是最常见的评分算法,它衡量一个词项在文档中的重要程度。 7. **查询解析(Query Parsing)**...

Global site tag (gtag.js) - Google Analytics