Lucene точный порядок

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

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

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

12.08.2008 05:51:01
3 ОТВЕТА
РЕШЕНИЕ

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

3
31.08.2008 11:40:56
Спасибо за ваше сообщение в блоге, объясняющее, как реализовать компаратор сортировки, который удобно не требует определения 2 классов. Однако, поскольку компаратор сортировки может работать только с двумя документами, не зная поискового запроса, он не может ранжировать результаты, как я их описал в своем вопросе. Как компаратор сортировки узнает, что поле имени "Лондон" точно соответствует поисковому слову "Лондон", если оно не может получить доступ к поисковому запросу?
dlamblin 3.09.2009 00:32:41
Я думаю, что вы можете сделать следующее: Класс, реализующий интерфейс ScoreDocComparator (AZ09Comparator в примере блога), будет иметь элемент «критерий поиска», который будет установлен при выполнении запроса. Метод сравнения (compare () в примере блога) может обращаться к этому полю во время его вызова и ранжировать документ с точным соответствием выше, чем у другого, не имеющего точного соответствия.
Yuval F 3.09.2009 06:00:36
Черт возьми, это то, что я получаю за то, что не продумал это (хотя прошло некоторое время с тех пор, как я был перед этим кодом). Теперь это имеет больше смысла и полезно.
dlamblin 8.09.2009 22:51:11

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

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

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

0
23.05.2017 12:21:43

API для

Sortcomparator

говорит

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

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

FieldSortedHitQueue

к sortcomparator, который имеет поле Comparator, для которого API говорит ...

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

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

1
4.09.2009 09:06:38