Как отсортировать результаты Lucene по значению поля с помощью HitCollector? - PullRequest
16 голосов
/ 31 января 2009

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

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

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


Обновление

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

Ответы [ 4 ]

25 голосов
/ 31 января 2009

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

new Sort("my_sort_field")

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

Lucene в действии охватывает все детали, а также сортировку по нескольким полям и т. Д.

0 голосов
/ 06 апреля 2016

Конструктор для сортировки, принимающий только имя строкового поля, устарел. Теперь вам нужно создать объект сортировки и передать его как последний параметр 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);
0 голосов
/ 19 февраля 2009

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

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

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

0 голосов
/ 01 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...