Elasticsearch Автоматическое завершение с использованием ngram
Я новичок в Elasticsearch, и у меня есть вопрос о реализации функции автозаполнения с использованием NGram. Из Интернета я понимаю, что реализация NGram позволяет использовать гибкое решение, такое как сопоставление по центру, выделение и т. Д., По сравнению с использованием встроенных подсказок для завершения.
Таким образом, у меня есть следующее отображение поля для одного из моих типов индекса:
"suggest_keywords": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
Конфигурация анализатора nGram:
"nGram_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"nGram_filter"
],
"type": "custom",
"tokenizer": "whitespace"
}
Ниже приведены примеры данных, которые я хотел бы получить для поля.
"suggest_keywords": [
"Wholesale",
"Fish",
"Seafood",
"Fishmongers",
"Markets"
],
Когда я сделаю запрос с использованием следующего, он вернется со всем массивом. Так как мне нужно только несколько
{
"query": {
"match":{
"suggest_keywords" : "food"
}
}
}
Я пытался использовать выделение для извлечения отдельных терминов, но выделенные термины присутствуют в каждом документе в результате поиска. Я попытался с агрегатами, но не смог написать запрос, который будет сочетать как выделение, так и агрегаты. Возможно ли это сделать?
{
"query": {
"match": {
"suggest_keywords": "nge"
}
},
"highlight": {
"fields": {
"suggest_keywords": {}
}
}
}
Или есть лучшая реализация для поиска из анализируемого массива nGram? или я должен индексировать все эти ключевые слова в разные типы?
Спасибо!
1 ответ
Вам лучше индексировать каждый элемент массива в отдельном документе, который позволяет найти только подходящие документы.
Вместо того, чтобы использовать:
POST /doctype
{
"suggest_keywords": [
"Wholesale",
"Fish",
"Seafood",
"Fishmongers",
"Markets"
]
}
используйте отдельные документы и индексируйте их отдельно:
doc1:
POST /doctype
{
"suggest_keywords": "Wholesale"
}
doc2:
POST /doctype
{
"suggest_keywords": "Fish"
}
и так далее...
Тогда в результате поиска вы получите соответствующий результат в отдельных документах