Lucene точный заказ

У меня была эта долгосрочная проблема, заключающаяся в том, что я не совсем понимал, как реализовать достойную сортировку или ранжирование Lucene. Скажем, у меня есть список городов и их населения. Если кто-то ищет "новый" или "лондонский", мне нужен список совпадений префиксов, упорядоченный по численности населения, и у меня это работает с поиском по префиксу и сортировкой по полю в обратном порядке, где есть поле населения, IE Нью-Мексико, Нью-Йорк ; или Лондон, Лондондерри.

Однако я также всегда хочу, чтобы точное совпадающее имя было вверху. Таким образом, в случае «Лондон» список должен показывать «Лондон, Лондон, Лондондерри», где первый Лондон находится в Великобритании, а второй Лондон находится в Коннектикуте, даже если в Лондондерри больше населения, чем в Лондоне, CT.

У кого-нибудь есть решение для единого запроса?

Ответов (3)

Решение

dlamblin, позвольте мне посмотреть, правильно ли я понял: вы хотите сделать запрос на основе префикса, а затем отсортировать результаты по населению и, возможно, объединить порядок сортировки с предпочтением точных совпадений. Я предлагаю вам отделить поиск от сортировки и использовать CustomSorter для сортировки: Вот запись в блоге, описывающая настраиваемый сортировщик . Классическая книга Lucene хорошо это описывает.

Мое текущее решение - создать программу точного поиска и программу поиска по префиксу, отсортированных по обратной совокупности, а затем скопировать все мои совпадения, начиная с точных совпадений, переходя к совпадениям по префиксу. Это делает просмотр моих результатов немного более раздражающим, чем я думаю.

Также я использовал хеш для удаления дубликатов, но позже изменил поисковик по префиксу на логический запрос поиска по префиксу (ДОЛЖЕН) с точным поиском (НЕ ДОЛЖЕН), чтобы Lucene удалила дубликаты. Хотя это казалось еще более расточительным.

Изменить : перемещено в комментарий (поскольку функция теперь существует): Yuval F Спасибо за ваш пост в блоге ... Как компаратор сортировки узнает, что поле имени "london" точно соответствует поисковому запросу "london", если он не может получить доступ поисковый запрос?

API для

Сортировщик

говорит

Для каждого уникального термина в поле существует отдельный Comparable - если в некоторых документах есть один и тот же термин в поле, в массиве кеша будут записи, которые ссылаются на один и тот же Comparable

Вы можете применить

FieldSortedHitQueue

в sortcomparator, у которого есть поле Comparator, для которого api говорит ...

Хранит компаратор, соответствующий каждому сортируемому полю.

Таким образом, термин можно отсортировать соответственно