16

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

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

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


更新

谢谢你的回答。我曾尝试使用,但当我作为参数值传递时TopFieldDocCollector出现错误消息。请建议一个有效的值来传递。"value is too small or too large"5000numHits

4

4 回答 4

25

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

new Sort("my_sort_field")

但是,可以对哪些字段进行排序有一些限制——它们需要被索引但不被标记化,并且值可以转换为Strings、Floats 或Integers。

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

于 2009-01-30T23:04:40.350 回答
0

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

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

于 2009-02-01T08:01:02.077 回答
0

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

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

但是,我不得不问,您为什么要收集 5000 个结果?交互式应用程序中的用户不会希望看到这么多。我认为愿意查看 200 个结果的用户很少见,但作为安全因素,将其翻倍至 400 个。根据应用程序,限制结果大小可能会阻碍恶意屏幕抓取并减轻拒绝服务攻击。

于 2009-02-19T18:22:33.710 回答
0

仅接受字符串字段名称的 Sort 构造函数已被弃用。现在您必须创建一个排序对象并将其作为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);
于 2016-04-06T18:09:26.650 回答