Языковые анализаторы и синонимы в одном поле в elasticsearch

#elasticsearch

#elasticsearch

Вопрос:

У меня есть немецкий анализатор для полей title и description (и он отлично работает для меня)

 "mappings": {
    "item" : {
      "properties" : {
        "title" : {
          "type" :    "string",
          "analyzer": "german"
        },
        "description" : {
          "type" :   "string",
          "analyzer": "german"
        }
      }
    }
  } 
  

Но теперь я попытался добавить синонимы. Как я могу добавить два анализатора в одно и то же поле?

Ответ №1:

Вы не смогли добавить два анализатора для 1 поля. Что вы могли бы сделать, так это описать пользовательский анализатор, который использует фильтр синонимов внутри и фильтр немецкой специфики в сочетании с необходимым токенизатором, поэтому в основном вам нужно смешать все, что вам нужно, пользовательским способом.

Можно было бы представить что-то вроде этого (очень грубый пример):

 PUT /my_index
    {
      "settings": {
        "analysis": {
          "filter": {
            "german_stop": {
              "type":       "stop",
              "stopwords":  "_german_" 
            },
            "german_stemmer": {
              "type":       "stemmer",
              "language":   "light_german"
            },
            "my_synonyms": {
              "type": "synonym", 
              "synonyms": [ 
                "british,english",
                "queen,monarch"
              ]
            }
          },
          "analyzer": {
            "german": {
              "tokenizer":  "standard",
              "filter": [
                "lowercase",
                "german_stop",
                "my_synonyms",
                "german_normalization",
                "german_stemmer"
              ]
            }
          }
        }
      }
    }
  

В цепочке фильтров вам нужно указать все фильтры, которые вы хотите включить — основы, синонимы, стоп-слова, строчные буквы и т. Д. И т. Д. (также имейте в виду, что порядок имеет значение), и используйте его внутри сопоставлений, как вы описали в своем вопросе.

Позже вы можете протестировать свой анализатор, выполнив

 GET /_analyze
{
  "analyzer": "german",
  "text": "Darf ich mit Bargeld bezahlen?"
}