Lucene自定义评分(Lucene 3.2)涉及迭代索引中的所有文档 - 最快的方式?

时间:2011-06-27 07:35:08

标签: java lucene

我正在尝试在Lucene中实现一个与tf-idf无关的自定义评分公式(例如,改变相似性,不起作用)。

为了做到这一点,我需要能够获取自定义查询并为索引中存储的每个文档生成一个分数 - 而不仅仅是与查询中的术语匹配的分数(因为我的评分涉及检查什么是本质上是同义词,所以即使文档没有确切的术语,它仍然可以产生正分数)。是创建IndexReader并为所有文档调用Document d = reader.doc(i)的最佳方式(如here所述),然后当场生成一个分数?

我一直在环顾Lucene的得分内部,特别是各种Scorer和Collector类,看来发生的事情(对于Lucene 3.2)是一个Weight提供了一个Scorer,它与Collector循环遍历所有匹配的文档查询。我可以以某种方式利用这种结构,但是再次获得一个自定义的Scorer实现来考虑所有文档吗?

3 个答案:

答案 0 :(得分:2)

如果您决定使用自定义评分方案,正确的方法是使用CustomScoreQuery的子类重写getCustomScoreProvider来返回CustomScoreProvider的子类。 CustomScoreQuery构造函数需要子查询。在这里,您需要提供一个快速的原生Lucene查询,它将在进行自定义分数计算之前尽可能缩小结果集范围。您还可以安排为每个文档存储任意数量的浮点值,并使您的自定义得分提供程序可以访问这些值。对于每个这样的浮点值,您需要为ValueSourceQuery的构造函数提供适当的CustomScoreQuery。在这些类中查看Javadocs,它们写得很好。不幸的是,我手边没有Java代码片段。

答案 1 :(得分:0)

据我了解Lucene,它将(term,doc)对存储在其索引中,因此查询实现为

  1. 获取包含查询字词的文档
  2. 对它们进行评分。
  3. 我从来没有实现自己的得分,但我先看IndexReader.termDocs;它似乎实施了第1步。

答案 2 :(得分:0)

使用IndexReader.termDocs,您可以遍历术语的发布列表,即包含该术语的所有文档。你可以使用它来提供你自己的查询处理自己的Lucene顶部,但是你将无法使用任何QuerySimilarity和东西。

另外,如果您正在使用同义词Lucene has some things in the contrib package。另一种可能的解决方案,不知道你是否尝试过,是通过Analyzer(或其他)将同义词注入文档。这样,即使文档没有查询条件,也可以返回文档。