5 нояб. 2019 г.

Elasticsearch. Замена знализатора по умолчанию

    Зачастую при работе с Elasticsearch для полей необходимо указать не стандартный анализатор. Например, если нам нужен анализатор для конкретного языка или необходимо специфическая обработка текста (например, исключить определенные слова, задать список синонимов, или как я уже писал – приравнять Ё к Е...).
    Задать полю не стандартный анализатор можно сделать при маппировании полей индекса:
PUT http://localhost:9200/test/_mappings
{
  "properties": {
    "id": { "type": "long" },
    "num": { "type": "text" },
    "name": {
      "type": "text",
      "analyzer": "new_ analyzer"
    }
  }
}
В этом примере, поле "num" будет обрабатыватсья стандартным анализатором, а поле "name" будет обрабатыватсья нашим собственным анализатором "new_ analyzer".
    А, что делать, если этот не стандартный анализатор нужно задать полям, которые маппируются динамически, а темплейт делать лень? Или для всех полей индекса?
    Сначала я попытался переопределить анализатор, который используется по умолчанию – "standard". Но это не помогло. Оказывается, если при маппировании полей полю не указать анализатор, то анализатор "standard" используется не напрямую, а ищется анализатор под названием "default", который по умолчанию ссылается "standard". Поэтому нам нужно переопределить анализатор "default":
PUT http://localhost:9200/test  
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "standard",
          "filter": [ "lowercase", "ru_RU", "stopwords_ru" ],
          "char_filter": [ "e_char_filter" ]
        }
      },
...
Теперь после создания индекса "test", все его поля, которым явно не задан анализатор, будут обрабатываться нашим анализатором.

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