Как отсортировать результаты 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
. Укажите допустимое значение.
Ответы
Ответ 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);