Luce_ne_Sco_ring_评分机制
来源:互联网 发布:电子科大网络教平台 编辑:程序博客网 时间:2024/06/04 18:16
http://grantbb.iteye.com/blog/181802
http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html
在Lucene得分公式中,已经包含了影响文档评分的各种因素。在表11.1中详细介绍了每一种因素对搜索结果评分的影响作用。
表11-1 Lucene得分公式的解释
因 素
在公式中的作用描述
tf(t in d)
词条t在文档d中出现的词频
idf( t )
词条t在文档中的倒排词频
boost(t.field in d)
在索引过程中设置的字段参数
lengthNorm(t.field in d)
字段的标准化值,表明在字段中存储了多少词条,这个数值是在索引过程中计算出来的,并且也存储在索引中
coord(q, d)
协调因子,它的计算是基于文档d中所包含的所有可供查询的词条数量
queryNorm(q)
在给出每个查询条目的方差和后,计算某查询的标准化值
搜索中,评分的过程:
- 创建一个查询对象 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 可能帮得上忙。
重要参考资料:
- http://lucene.apache.org/java/2_4_1/scoring.html
- 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
- Luce_ne_Sco_ring_评分机制
- Lucene:评分机制
- Lucene的评分机制
- Lucene Scoring 评分机制
- Nutch 评分机制分析
- Lucene Scoring 评分机制
- Lucene Scoring 评分机制
- Lucene的评分机制
- Lucene评分机制
- lucene 的评分机制
- Lucene 评分机制
- Lucene 评分机制
- Lucene评分机制
- solr 评分机制
- lucene评分机制
- Lucene评分机制
- solr评分机制
- Lucene Scoring 评分机制
- C 语言中 #pragma 的使用
- jsf中后台取前台页面组件的值
- 循环队列的相关操作
- java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
- 大数据排名分析
- Luce_ne_Sco_ring_评分机制
- ubuntu下绑定IP地址
- 百度翻译API - PHP实现
- Java 中国移动、中国联通
- HAHA
- java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'
- 网站SEO工具篇之外链查询工具
- 手机号
- MyISAM和Innodb比较