Подтвердить что ты не робот

Как отсортировать результаты Lucene по значению поля с помощью HitCollector?

Я использую следующий код для выполнения запроса в Lucene.Net

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

Как отсортировать результаты поиска на основе поля?


Update

Спасибо за ваш ответ. Я попытался использовать TopFieldDocCollector, но я получил сообщение об ошибке "value is too small or too large", когда я передал 5000 как значение аргумента numHits. Укажите допустимое значение.

4b9b3361

Ответ 1

Метод search.Searcher.search примет search.Sort, который можно построить так же, как:

new Sort("my_sort_field")

Однако существуют некоторые ограничения, по которым можно сортировать поля - их нужно индексировать, но не обозначать, а значения конвертируются в String s, Float или Integer s.

Lucene in Action содержит все детали, а также сортировку по нескольким полям и т.д.

Ответ 2

То, что вы ищете, вероятно, TopFieldDocCollector. Используйте его вместо GroupingHitCollector (что это?) Или внутри него.

Прокомментируйте это, если вам нужна дополнительная информация. Я буду рад помочь.

Ответ 3

В исходной (Java) версии Lucene нет жестких ограничений на размер результатов TopFieldDocCollector. Любое число, большее нуля, принимается. Хотя ограничения памяти и ухудшение производительности создают практический предел, который зависит от вашей среды, 5000 обращений тривиально и не должны создавать проблемы за пределами мобильного устройства.

Возможно, при переносе Lucene, TopFieldDocCollector был изменен для использования чего-то другого, кроме реализации "кучи" Lucene (называемого PriorityQueue, extended by FieldSortedHitQueue)), что накладывает неоправданно малый предел размера результатов. Если это так, вы можете посмотреть исходный код для TopFieldDocCollector и реализовать свой собственный подобный хит-коллекционер, используя лучшую реализацию кучи.

Я должен спросить, однако, почему вы пытаетесь собрать 5000 результатов? Ни один пользователь в интерактивном приложении не захочет увидеть это. Я полагаю, что пользователи, желающие посмотреть 200 результатов, редки, но удваивают его до 400 как фактор безопасности. В зависимости от приложения ограничение размера результата может препятствовать вредоносным экранам и смягчать атаки на отказ в обслуживании.

Ответ 4

Конструктор для Сортировки, принимающий только имя поля строки, был обесценен. Теперь вам нужно создать объект сортировки и передать его в качестве последнего параметра searchcher.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);