我知道可以获取 Lucene 索引中的顶级术语,但是有没有办法根据 Lucene 索引的子集获取顶级术语?
IE。特定日期范围内的文档索引中最重要的术语是什么?
理想情况下,应该有一个实用程序可以执行此操作,但我不知道有这样的实用程序。然而,以相当有效的方式“手动”完成此操作并不太难。我假设你已经有一个Query
and/or Filter
可用于定义感兴趣的子集的对象。
首先,在内存中构建索引子集中所有文档 ID 的列表。您可以使用IndexSearcher.search(Query, Filter, HitCollector)
非常快地做到这一点;这HitCollector
文档 http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/HitCollector.html包括一个看起来应该可以工作的示例,或者您可以使用其他容器来存储您的文档 ID。
接下来,初始化一个空的 HashMap(或其他)以将术语映射到总频率,并通过调用其中之一来填充映射IndexReader.getTermFreqVector
每个文档和感兴趣的领域的方法。三参数形式看起来更简单,但任何一个都应该没问题。对于三参数形式,你会做一个TermVectorMapper
whose map
方法检查是否term
位于地图中,将其与frequency
如果没有,或者添加frequency
如果是的话,则为现有值。请务必使用相同的TermVectorMapper
对象跨所有调用getTermFreqVector
在这一过程中,而不是为循环中的每个文档实例化一个新文档。您还可以通过覆盖来加快速度isIgnoringPositions()
and isIgnoringOffsets()
;你的对象应该返回true
对于这两点。看起来像你的TermVectorMapper
也可能被迫定义一个setExpectations
方法,但该方法不需要执行任何操作。
构建好地图后,只需按频率降序对地图项进行排序,然后读出您喜欢的最重要术语即可。如果您事先知道需要多少个术语,您可能更喜欢使用某种基于堆的奇特算法来查找顶部k线性时间内的项目而不是使用 O(n log n) 种类。我想普通的旧类型在实践中会很快。但这取决于你。
如果您愿意,您可以通过让您的HitCollector
invoke getTermFreqVector
直接地。这当然应该产生同样正确的结果,并且直观地看起来它会更简单更好,但文档似乎警告说,这样做可能比两遍方法慢很多(与 HitCollector 示例在同一页面上)多于)。或者我可能误解了他们的警告。如果您雄心勃勃,可以尝试两种方法,进行比较,然后告诉我们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)