ElasticSearch - множественное совпадение cross_fields с нечетким поиском

У меня есть документы, представляющие пользователей. Они имеют поля name и surname.

Скажем, у меня есть два пользователя, проиндексированных - Майкл Джексон и Майкл Старр. Я хочу, чтобы эти образцы поиска работали:

  • Майкл = > {Майкл Джексон, Майкл Старр}
  • Jack Mich = > {Michael Jackson} (неполные слова и обратный порядок)
  • Michal Star = > {Michael Starr} (нечеткий поиск)

Я пробовал разные запросы и получал лучшие результаты из запроса multi_match с типом cross_fields. Однако есть две проблемы:

  • Он только находит что-то, когда по крайней мере одно из двух слов завершено. Если я наберу Джексона Мика, он найдет Майкла Джексона, но если я наберу Джек Мич, он ничего не найдет (но я хочу, чтобы он его нашел).
  • Невозможно установить нечеткий поиск. Мне действительно нужен нечеткий поиск, но сохраняйте качество multi_match с типом cross_fields.

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

Я новичок в ElasticSearch, поэтому, возможно, я пропустил что-то очевидное. Извините, если я это сделаю.

Ответ 1

Тип поиска Джека Мика

  • Убедитесь, что когда вы запрашиваете использование OR, а не AND, например. Jack OR Mich
  • Также вы хотите выполнить частичное сопоставление полей. Для этого вам нужно включить nGrams в эти поля (сделать это при сопоставлении), чтобы индекс имел совпадения для частичных слов

Вы используете правильный тип запроса. Эти два должны решить ваши проблемы.

PS: Мы все учимся здесь, делая это вместе весело:)

Ответ 2

Чтобы ответить на вашу вторую проблему:

Невозможно установить нечеткий поиск. Мне действительно нужен нечеткий поиск, но сохраняйте качество multi_match с типом cross_fields.

Запрос cross_fields не поддерживает нечеткий поиск. См. Вопрос о GitHub:

https://github.com/elasticsearch/elasticsearch/issues/6866