elasticsearch поиск по части слова

Недавно я начал использовать ElasticSearch, и я не могу заставить его искать часть слова.

Пример. У меня есть три документа из моего куба, проиндексированного в ElasticSearch:

Итак, теперь я хочу искать все документы, содержащие «Doe»

Это не возвращает никаких обращений. Но если я ищу

Он возвращает один документ (John Doeman).

Я попытался настроить различные анализаторы и различные фильтры как свойства моего индекса. Я также попытался использовать полномасштабный запрос (например:

) Но ничего не работает.

Как я могу заставить ElasticSearch найти и John Doeman и Jane Doewoman, когда я ищу «Doe»?

UPDATE

Я попытался использовать токенизатор nGram и фильтр, как и предложил Игорь:

Теперь проблема заключается в том, что каждый запрос возвращает ВСЕ документы. Любые указатели? Документация ElasticSearch по использованию nGram невелика.

79285 просмотра

9 ответа

1312 Репутация автора

Я недавно начал использовать ElasticSearch, и я не могу заставить его искать часть слова.

Пример: у меня есть три документа из моего couchdb, проиндексированных в ElasticSearch:

Итак, теперь я хочу найти все документы, содержащие «Доу»

Это не возвращает никаких хитов. Но если я ищу

Он возвращает один документ (Джон Доуман).

Я попытался установить разные анализаторы и разные фильтры в качестве свойств моего индекса. Я также попытался использовать полный запрос (например:

) Но, похоже, ничего не работает.

Как я могу заставить ElasticSearch найти и Джона Доумана, и Джейн Доуоман, когда я ищу «Доу»?

ОБНОВИТЬ

Я попытался использовать токенайзер nGram и фильтр, как предложил Игорь, вот так:

Проблема, которую я имею сейчас, состоит в том, что каждый запрос возвращает ВСЕ документы. Есть указатели? Документация ElasticSearch по использованию nGram не велика .

Ответы (9)

-8 плюса

1312 Репутация автора

Не берите в голову.

Я должен был посмотреть на документацию Lucene. Кажется, я могу использовать подстановочные знаки! 🙂

Автор: ldx Размещён: 24.06.2011 11:56

59 плюса

26275 Репутация автора

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

Автор: imotov Размещён: 24.06.2011 05:23

78 плюса

1347 Репутация автора

Я тоже использую nGram. Я использую стандартный токенизатор и nGram как фильтр. Вот моя установка:

Давайте найдем части слова до 50 букв. Настройте max_gram, как вам нужно. По-немецки слова могут стать действительно большими, поэтому я установил их на высокое значение.

Автор: roka Размещён: 20.09.2011 09:47

4 плюса

2657 Репутация автора

Для решения проблемы использования диска и проблемы слишком длинных поисковых терминов используются короткие нграммы длиной 8 символов (настроенные с помощью: «max_gram»: 8 ). Чтобы выполнить поиск по терминам, содержащим более 8 символов, включите поиск в логический запрос AND для поиска каждой отдельной 8-символьной подстроки в этой строке. Например, если пользователь искал большой ярд (строка из 10 символов), поиск будет:

«Arge Ya и Arge YAR И RGE ярд .

11 плюса

453 Репутация автора

без изменения отображений индекса вы можете выполнить простой префиксный запрос, который будет выполнять частичный поиск, как вы и надеялись

37 плюса

2388 Репутация автора

Я думаю, что нет необходимости менять отображение. Попробуйте использовать query_string , это идеально. Все сценарии будут работать со стандартным анализатором по умолчанию:

У нас есть данные:

Сценарий 1:

Сценарий 2:

Сценарий 3:

РЕДАКТИРОВАТЬ — та же реализация с упругим поиском данных весны https://stackoverflow.com/a/43579948/2357869

Еще одно объяснение, как query_string лучше, чем другие https://stackoverflow.com/a/43321606/2357869

2 плюса

1685 Репутация автора

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

В двух словах, это структура данных в памяти, называемая FST, которая содержит действительные предложения и оптимизирована для быстрого поиска и использования памяти. По сути, это просто график. Например, и FST , содержащее слово hotel , marriot , mercure , munchen и munich будет выглядеть следующим образом :

Автор: Neshta Размещён: 03.03.2018 03:57

1 плюс

21 Репутация автора

Вы можете использовать регулярное выражение.

если вы используете этот запрос:

Вам будут переданы все данные, имена которых начинаются с буквы «J». Подумайте, хотите ли вы получить только первые две записи, имена которых оканчиваются на «man», поэтому вы можете использовать этот запрос:

и если вы хотите получить все записи, которые в их названии существуют «m», вы можете использовать этот запрос:

Это работает для меня. И я надеюсь, что мой ответ подойдет для решения вашей проблемы.

0 плюса

23 Репутация автора

Использование wilcards (*) предотвращает подсчет очков

Есть задача, справочник сотрудников, нужно делать поиск по нему

К примеру есть 2 записи:

1
fname = Мария
sname = Иванова
2
fname = Максим
sname = Плюшкин

Пишем Ма находим 1 и 2 запись
Пишем Ма Плю находим 2 запись

  • Вопрос задан более двух лет назад
  • 1537 просмотров

Не знаю как по сравнению с nGram’ами, нужно тестировать, но есть вариант использовать fuzzy-запросы:

Но вообще такие нечеткие fuzzy-запросы для ластика весьма «тяжелы». Так что этот подход имеет смысл использовать только если у вас база не исчисляется миллионами записей и/или гигабайтами занимаемого места.

Источник: computermaker.info

Понравилась статья? Поделиться с друзьями:
Ок! Компьютер
Добавить комментарий