如何获得Lucene索引中文档子集的顶部条款?

我知道它有可能获得Lucene索引中的顶级条款,但是有没有办法根据Lucene索引的子集获得顶级条款?如何获得Lucene索引中文档子集的顶部条款?

I.e.索引中某些日期范围内的文档有哪些主要条款?

回答:

理想情况下,应该有一个实用工具来做到这一点,但我不知道。但是,以合理高效的方式“手动”操作并不难。我假设您已经有一个Query和/或Filter对象,您可以使用它来定义感兴趣的子集。

首先,在您的索引子集中的内存中建立所有文档ID。您可以使用IndexSearcher.search(Query, Filter, HitCollector)快速完成此操作; HitCollectordocumentation包括一个看起来应该起作用的示例,或者您可以使用其他容器来存储您的文档ID。

接下来,初始化一个空的HashMap(或其他)以将术语映射到总频率,并通过为每个感兴趣的文档和字段调用IndexReader.getTermFreqVector方法之一来填充映射。三个参数的形式似乎更简单,但要么应该没问题。对于三参数表单,您可以制作一个TermVectorMapper,其map方法检查term是否在地图中,如果不是,则将其与frequency关联,或者如果是,则将frequency添加到现有值。请确保在此过程中跨getTermFreqVector的所有调用使用相同的TermVectorMapper对象,而不是为循环中的每个文档实例化一个新对象。你也可以通过重写isIgnoringPositions()isIgnoringOffsets()来加快速度;你的对象应该返回true这两个。它看起来像你的TermVectorMapper也可能被迫定义一个setExpectations方法,但那个不需要做任何事情。

一旦你建立了你的地图,只需按降序对地图项进行排序,然后读出你喜欢的许多顶级字词。如果您事先知道您需要多少条款,您可能更喜欢使用某种基于堆的算法,以线性时间的形式查找顶级项目,而不是使用O(n n n)sort 。我想在实践中这种普通的旧类型会很快。但这取决于你。

如果您愿意,可以通过让您的HitCollector直接调用getTermFreqVector来结合前两个阶段。这当然应该产生同样正确的结果,并且直观地看起来会更简单和更好,但是文档似乎警告说这样做可能比两遍方法慢很多(与HitCollector示例相同的页面上以上)。否则我可能会误解他们的警告。如果你觉得雄心勃勃,你可以尝试两种方式,比较,并让我们知道。

回答:

计算TermVectors将会起作用,但如果有大量文档需要迭代,将会变慢。另外请注意,如果您是通过排名靠前的术语来表示docFreq,那么请不要使用TermFreqVector中的计数将这些术语计为二进制。

或者,您可以迭代像facet counts这样的术语。每学期使用cached filter;他们的BitSets可用于快速交点计数。

以上是 如何获得Lucene索引中文档子集的顶部条款? 的全部内容, 来源链接: utcz.com/qa/259171.html

回到顶部