Нечеткий поиск Lucene по именам клиентов и частичному адресу

Я просмотрел все существующие сообщения с вопросами, но не смог найти что-то особенно важное.

У меня есть файл с миллионами записей для имени человека, фамилии, адреса 1, адреса 2, кода страны, даты рождения. Я хотел бы ежедневно проверять свой список клиентов с указанным выше файлом (мой список клиентов также обновляется ежедневно и файл также обновляется ежедневно).

Для имени и фамилии я хотел бы нечеткое совпадение (может быть совпадение 90% расстояния lucene fuzzyquery/levenshtein), а для остальных полей страны и даты рождения я хотел точное совпадение.

Я новичок в Lucene, но, глядя на количество сообщений, похоже, что это возможно.

Мои вопросы:

  • Как мне проиндексировать входной файл? Мне нужно построить индекс по комбинации FN, LN, страны, даты рождения и использовать индекс для поиска
  • Как я могу использовать нечеткий запрос Lucene здесь?

Есть ли другой способ реализовать то же самое?


person Rushik    schedule 08.12.2010    source источник


Ответы (2)


Рушик, вот несколько идей:

  • Попробуйте использовать Solr. Начать использовать его гораздо проще, чем голый Lucene.
  • Создайте индекс файла Lucene/Solr. Получается, что документа на клиента достаточно, если вы используете многозначное поле или два разных поля для адресов.
  • У вас есть уникальный идентификатор для каждого человека? Чтобы использовать Solr, он вам нужен. В Lucene вы можете обойтись без использования уникального идентификатора.
  • Сохраните код страны как «ключевое слово». Если вам требуется только точное совпадение даты рождения, вы можете сделать то же самое. Для запросов диапазона вам понадобится другое представление.
  • Я предполагаю, что ваш список клиентов меньше, чем файл. Возможной политикой было бы ежедневное индексирование изменений в файле (здесь уникальный идентификатор действительно удобен - в противном случае вам нужно удалить запрос, который может пропустить метку). Затем вы можете оптимизировать индекс, а после этого запустить поиск вашего обновленного списка клиентов.
  • Вы описываете BooleanQuery, Чьи предложения являются нечеткими запросами на имя и фамилию и терм-запросами на остальные поля. Вы можете создать запрос программно или с помощью парсера запросов.
  • Попробуйте использовать soundex для имен, как описано здесь.
person Yuval F    schedule 08.12.2010
comment
Спасибо, Юваль, да, у меня есть уникальный идентификатор для каждого человека в файле, поэтому я должен быть в порядке. список клиентов намного меньше, чем личное дело. Я попробую это решить и вернуться. - person Rushik; 08.12.2010

Стоит прочитать некоторые научные статьи на эту тему (погуглите бесплатные PDF-файлы):

  • Сравнение сопоставления личных имен: методы и практические вопросы (2006 г.)
  • Обзор связи записей и текущих направлений исследований (2006 г.)
  • Параллельная система связи с открытым исходным кодом (2004 г.)

Вы также должны рассмотреть следующие библиотеки/фреймворки:

(Ответ для будущих посетителей.)

person Richard EB    schedule 20.10.2015