Недавно я начал использовать 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-запросы для ластика весьма «тяжелы». Так что этот подход имеет смысл использовать только если у вас база не исчисляется миллионами записей и/или гигабайтами занимаемого места.
Источник: