Анализатор на основе пользовательских файлов Elasticsearch

#elasticsearch

#эластичный поиск #elasticsearch

Вопрос:

Я использую elasticsearch 6 и у меня есть полное текстовое поле в индексе. Это поле хранит категорию продукта и может принимать только одно из нескольких возможных значений (например, фрукты, листовые овощи и т.д.). Я хочу проанализировать поле пользовательским способом с помощью токенов, указанных в файле.
Например

свежие фрукты->[фрукты, fresh fruit]

Есть ли способ использовать пользовательский анализатор с конечными токенами, поступающими из файла сопоставления, как указано выше.

Ответ №1:

То, что вы ищете, — это фильтр токенов синонимов. Вам нужно создать пользовательский анализатор, который использовал этот фильтр, чтобы при вводе строки fresh fruit или fruit затем он генерировал один токен fruit . Вы можете достичь этого, определив анализ в настройках индекса. Создайте пользовательский анализатор, который использует фильтр, а затем примените этот анализатор к category полю, как показано ниже:

 PUT my_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_synonym_analyzer": {
            "tokenizer": "standard",
            "filter": [
              "lowercase",
              "custom_synonym"
            ]
          }
        },
        "filter": {
          "custom_synonym": {
            "type": "synonym",
            "synonyms": [
              "fresh fruit, fruit => fruit"
            ],
            //"synonyms_path": "analysis/synonyms.txt"    <---- replace "synonyms" above with this to use file instead of array of synonyms
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "category": {
          "type": "text",
          "analyzer": "my_synonym_analyzer"
        }
      }
    }
  }
}
  

Теперь при поиске либо fruit либо fresh fruit по category полевым документам будут совпадать либо fruit либо fresh fruit . Это связано с тем, что при поиске по полю elastic search по умолчанию использует тот же анализатор для строки поиска, который был применен к полю при индексации, что в этом случае в конечном итоге сводится к fruit в любом случае ( fruit или fresh fruit ), и, следовательно, документы будут совпадать.

Комментарии:

1. Спасибо за подход, это, безусловно, может сработать. Если, скажем, мне нужно добавить новые сопоставления в файл синонимов, то требует ли это закрытия-открытия индекса? ИЛИ переиндексация?

2. В этом случае вам придется перезапустить узлы.

3. @SauravPrakash Это решило вашу проблему? Если да, пожалуйста, не стесняйтесь принять и поддержать.