如何使用HitCollector按字段值对Lucene结果进行排序?

时间:2009-01-30 22:55:39

标签: search lucene

我正在使用以下代码在Lucene.Net中执行查询

var collector = new GroupingHitCollector(searcher.GetIndexReader());
searcher.Search(myQuery, collector);
resultsCount = collector.Hits.Count;

如何根据字段对这些搜索结果进行排序?


更新

感谢your answer。我曾尝试使用TopFieldDocCollector,但当我将"value is too small or too large"作为5000参数值传递时,我收到错误消息numHits。请建议通过有效值。

4 个答案:

答案 0 :(得分:25)

search.Searcher.search方法将接受search.Sort参数,该参数可以简单地构造为:

new Sort("my_sort_field")

但是,对哪些字段可以进行排序存在一些限制 - 它们需要编入索引但不能标记化,并且值可转换为String s,Float s或Integer

Lucene in Action涵盖所有细节,以及按多个字段排序等。

答案 1 :(得分:0)

您正在寻找的可能是TopFieldDocCollector。使用它而不是GroupingHitCollector(那是什么?),或者在里面。

如果您需要更多信息,请对此进行评论。我很乐意提供帮助。

答案 2 :(得分:0)

在Lucene的原始(Java)版本中,对TopFieldDocCollector结果的大小没有严格的限制。任何大于零的数字都被接受。虽然内存限制和性能下降会产生一个取决于您的环境的实际限制,但5000次点击是微不足道的,不应该在移动设备之外造成问题。

也许在移植Lucene时,TopFieldDocCollector被修改为使用除Lucene的“堆”实现之外的东西(称为PriorityQueue,由FieldSortedHitQueue扩展) - 这种情况对其施加了不合理的小限制结果大小。如果是这样,您可能希望查看TopFieldDocCollector的源代码,并使用更好的堆实现来实现您自己的类似命中收集器。

但是,我要问,你为什么要收集5000个结果?交互式应用程序中的用户不希望看到那么多用户。我认为用户愿意看200个结果是罕见的,但只是作为安全因素加倍到400。根据应用程序的不同,限制结果大小可能会妨碍恶意屏幕抓取工具并减轻拒绝服务攻击。

答案 3 :(得分:0)

已经折旧了仅接受字符串字段名称的排序构造函数。现在您必须创建一个排序对象并将其作为searcher.Search()

的最后一个参数传递
/* sorting by a field of type long called "size" from greatest -> smallest 
(signified by passing in true for the last isReversed paramater)*/

Sort sorter = new Sorter(new SortField("size", SortField.Type.LONG, true))
searcher.Search(myQuery, collector, sorter);