【发布时间】:2011-03-14 23:50:10
【问题描述】:
我想为给定查询计算少量文档(而不是整个集合)的分数。我的尝试如下所示,为每个文档返回 0 分,即使我测试的查询是从我要评分的文档中的术语派生的。我正在使用 Lucene 3.0.3。
List<Float> score(IndexReader reader, Query query, List<Integer> newDocs ) {
List<Float> scores = new List<Float>();
IndexSearcher searcher = reader.getSearcher();
Collector collector = TopScoreDocCollector.create(newDocs.size(), true);
Weight weight = query.createWeight(searcher);
Scorer scorer = weight.scorer(reader, true, true);
collector.setScorer(scorer);
float score = 0.0f;
for(Integer d: newDocs) {
scorer.advance(d);
collector.collect(d);
score = scorer.score();
System.out.println( "doc: " + d + "; score=" + score);
scores.add( new Float(score) );
}
return scores;
}
我显然在评分设置中遗漏了一些东西,但我无法从 Lucene 源代码中弄清楚那可能是什么。
提前致谢,
基因
【问题讨论】:
-
是的。在深入研究低级评分之前,您应该首先尝试一种高级方法,例如过滤。或者我们错过了一些东西。在这种情况下,请告诉我们您为什么只需要为这组打分;这是表演吗?还是特殊应用?尽管如此,在这两种情况下,我相信您都可以在 Lucene 中找到更易于使用的现有机制。
-
是的,我希望提高性能。我有一个先前缓存的大约 1000 个文档的结果列表,并且我知道新添加的文档可能与此查询匹配。我想用最少的计算量来更新搜索结果。
-
感谢过滤器提示。这似乎是正确的方法,但实际上我在从中获得结果时遇到了问题。我创建了一个在匿名 Filter() 类中返回的 SortedVIntList DocIdSet。当我单步执行代码时,我输入的 docid (14186) 似乎与读者所拥有的 (14188) 相差了两个,这意味着文档永远不会被评分。我哪里错了?
标签: lucene