【问题标题】:How to score a small set of docs in Lucene如何在 Lucene 中对一小部分文档进行评分
【发布时间】: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


【解决方案1】:

使用过滤器,然后执行search with that filter。然后像普通搜索一样遍历结果 - Lucene 将处理过滤。

一般来说,如果您正在查看 DocId,您可能使用了比您需要的更低级别的 API,这会给您带来麻烦。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2013-06-08
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多