我正在使用以下代码在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
。请建议通过有效值。
答案 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);