Lucene自定义评分(Lucene 3.2)需要遍历索引中的所有文档 - 最快的方法是什么?

3

我正在尝试在Lucene中实现一种与tf-idf无关的自定义评分公式(因此仅更改相似度将不起作用)。

为了做到这一点,我需要能够针对索引中存储的每个文档生成得分-而不仅仅是匹配查询术语的文档(因为我的评分涉及检查本质上是同义词的内容,因此即使文档没有确切的术语,它仍然可以产生积极的分数)。最好的方法是创建一个IndexReader并调用Document d = reader.doc(i)以获取所有文档的信息(如此处所述here),然后即时生成分数。

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


我非常好奇你尝试实现什么样的计分方式。 - Fred Foo
3个回答

2

如果您决定采用自定义评分方案,则正确的方法是使用CustomScoreQuery子类,并重写getCustomScoreProvider以返回CustomScoreProvider子类。 CustomScoreQuery构造函数需要一个子查询。在这里,您将希望提供一个快速的本地Lucene查询,该查询可以在通过自定义评分计算之前尽可能缩小结果集。您还可以安排存储任意数量的浮点值与每个文档,并使其可由自定义评分提供程序访问。您将需要为每个此类浮点值向CustomScoreQuery的构造函数提供适当的ValueSourceQuery。请参阅这些类的Javadocs,它们写得很好。不幸的是,我手头没有Java代码片段。


0

据我理解,Lucene将(term,doc)对存储在其索引中,因此查询的实现方式如下:

  1. 获取包含查询词的文档,
  2. 对它们进行评分/排序。

我从未实现过自己的评分算法,但我会首先查看IndexReader.termDocs;它似乎实现了第一步。


0

使用IndexReader.termDocs,您可以遍历一个术语的帖子列表,即包含该术语的所有文档。您可以使用此功能在Lucene之上提供自己的查询处理,但是那样您将无法使用任何QuerySimilarity等内容。

另外,如果您正在使用同义词Lucene在contrib包中有一些东西。另一个可能的解决方案(不知道您是否尝试过)是通过Analyzer(或其他方式)将同义词注入文档中。这样,即使文档没有查询术语,您也可以返回它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接