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"
}

и так далее...

Тогда в результате поиска вы получите соответствующий результат в отдельных документах

Другие вопросы по тегам