# Как добавить analyser к существующему индексу?

**URL:** <https://discuss.elastic.co/t/analyser/152614>\
**Category:** Вопросы на русском языке\
**Created:** [October 16, 2018, 9:23am UTC](https://discuss.elastic.co/t/analyser/152614 "2018-10-16T09:23:10Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 16, 2018, 9:23am UTC](https://discuss.elastic.co/t/analyser/152614/1 "2018-10-16T09:23:10Z")

</div>

Есть индекс xenf с текстовым полем messages. Я хочу делать текстовый анализ этого поля и пытаюсь прикрутить анализатор примерно вот так:

```
PUT xenf
{
"settings": {
    "analysis": {
      "filter": {
        "custom_english_stemmer": {
          "type": "stemmer",
          "name": "english"
        }
      },
      "analyzer": {
        "custom_lowercase_stemmed": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "custom_english_stemmer"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "message": {
          "type": "string",
          "analyzer": "custom_lowercase_stemmed"
        }
      }
    }
  }
} 

```

При этом получаю ошибку вида

```
{
  "error": {
    "root_cause": [
      {
        "type": "resource_already_exists_exception",
        "reason": "index [xenf/wG1wAqS-TZ-fLOyj2hE3Aw] already exists",
        "index_uuid": "wG1wAqS-TZ-fLOyj2hE3Aw",
        "index": "xenf"
      }
    ],
    "type": "resource_already_exists_exception",
    "reason": "index [xenf/wG1wAqS-TZ-fLOyj2hE3Aw] already exists",
    "index_uuid": "wG1wAqS-TZ-fLOyj2hE3Aw",
    "index": "xenf"
  },
  "status": 400
}

```

Я не пойму, как мне сделать анализатор для текстового поля на уже существующем индексе?  
Спасибо.

---

<div class="post-metadata">

**Author:** ![Vladimir.Dolzhenko](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vladimir.dolzhenko/32/34352_2.png) [@Vladimir.Dolzhenko](https://discuss.elastic.co/u/Vladimir.Dolzhenko)\
**Post date:** [October 16, 2018, 10:57am UTC](https://discuss.elastic.co/t/analyser/152614/2 "2018-10-16T10:57:04Z")

</div>

Нельзя поменять анализатор к уже существующему индексу и его полю - это связано с тем, что Lucene хранит термы полученные на выходе анализатора.

Что можно сделать так это создать новый индекс с новым анализатором и сделать [reindex](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html) из старого индекса в новый

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 16, 2018, 12:53pm UTC](https://discuss.elastic.co/t/analyser/152614/3 "2018-10-16T12:53:06Z")

</div>

Спасибо. Вроде бы переиндексировал. Но не пойму, как удостовериться теперь, что все работает как надо?

GET \_analyze

выдает ошибку вида

```
{
  "error": {
    "root_cause": [
      {
        "type": "parse_exception",
        "reason": "request body or source parameter is required"
      }
    ],
    "type": "parse_exception",
    "reason": "request body or source parameter is required"
  },
  "status": 400
}
```

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 16, 2018, 12:57pm UTC](https://discuss.elastic.co/t/analyser/152614/4 "2018-10-16T12:57:08Z")

</div>

А такой запрос

```
POST _analyze
{
  "analyzer": "custom_lowercase_stemmed",
  "text": "The quick brown fox."
}

```

выдает

```
{
  "error": {
    "root_cause": [
      {
        "type": "remote_transport_exception",
        "reason": "[IATGesG][195.214.233.98:9300][indices:admin/analyze[s]]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "failed to find global analyzer [custom_lowercase_stemmed]"
  },
  "status": 400
}
```

---

<div class="post-metadata">

**Author:** ![Vladimir.Dolzhenko](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vladimir.dolzhenko/32/34352_2.png) [@Vladimir.Dolzhenko](https://discuss.elastic.co/u/Vladimir.Dolzhenko)\
**Post date:** [October 16, 2018, 1:12pm UTC](https://discuss.elastic.co/t/analyser/152614/5 "2018-10-16T13:12:04Z")

</div>

Такой синтаксис использует глобальный анализатор - и он недоступен по понятным причинам.

Попробуйте использовать [анализатор для поля](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.html#_camelcase_tokenizer) (из приведённого выше вы делали для поля `message`):

```auto
GET index_name/_analyze
{
  "field": "message",
  "text": "The quick brown fox."
}

```

где `index_name` это имя вашего нового индекса (с новым анализатором)

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 16, 2018, 1:28pm UTC](https://discuss.elastic.co/t/analyser/152614/6 "2018-10-16T13:28:31Z")

</div>

Да, действительно, так работает, спасибо.  
Не совсем понятно практическое использование анализатора. Есть поле message, которое постоянно пополняется текстовыми данными. На это поле настроен анализатор. Как получать результаты его работы. Например, из текстов я хотел бы получать ключевые слова, чтобы их видеть в визуализациях Kibana.

---

<div class="post-metadata">

**Author:** ![andrershov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/andrershov/32/36612_2.png) [@andrershov](https://discuss.elastic.co/u/andrershov)\
**Post date:** [October 17, 2018, 12:15pm UTC](https://discuss.elastic.co/t/analyser/152614/7 "2018-10-17T12:15:05Z")

</div>

Не совсем понятно, чего вы хотите достичь. Анализатор используется для того, чтобы текстовое поле разбивать на термы. Например, у вас есть строка

```auto
Я изучаю ElasticSearch

```

и вы хотите на выходе получить термы: "я", "изучаю", "ElasticSearch". Для этого можно использовать стандартный анализатор.  
Анализатор НЕ предназначен для того, чтобы из текста (или одного поля mapping'a) получать несколько полей. Например, у вас есть лог сообщение

```auto
12-Oct-2018 DEBUG Something happened

```

с помощью анализатора не получиться это сообщение превратить в три поля типа timestamp (для даты), keyword (для уровня логирования) и text (для сообщения). Для этого нужно либо уже отправлять данные в структурированном формате (используя LogStash или Beats) или же использовать Ingestion возможности ElasticSearch.

[https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest.html](https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest.html)

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 18, 2018, 5:55am UTC](https://discuss.elastic.co/t/analyser/152614/8 "2018-10-18T05:55:12Z")

</div>

Да, спасибо. Я ранее использовал Rosette Ingest Pipeline [https://github.com/rosette-api/rosette-elasticsearch-plugin/blob/master/docs/Rosette-API-Plugin-for-Elasticsearch-Doc-Enrichment.md](https://github.com/rosette-api/rosette-elasticsearch-plugin/blob/master/docs/Rosette-API-Plugin-for-Elasticsearch-Doc-Enrichment.md) для лингво анализа текстового поля. Подключал этот pipeline в разделе output конфига Logstash-а и в индексе Elasticsearch уже имел поля с keywords, sentiments, entities.  
Просто подумал, что то же самое можно было бы реализовать встроенным в Elasticsearch анализатором. Вот и пытался разобраться с ним. Но честно говоря, так и не понял, каким способом его можно применять на практике 🙂

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 18, 2018, 10:22am UTC](https://discuss.elastic.co/t/analyser/152614/9 "2018-10-18T10:22:27Z")

</div>

Подскажите пожалуйста, как бы можно было решить такую задачу. В поле message есть текст на английском. Я бы хотел дополнительно иметь поле, скажем, words где бы тот же самый текст складывался обработанный английским анализатором stop words, если не ошибаюсь, который бы удалял все слова вида the, from, where, to, a, thanks и так далее из текста из поля messages.  
Спасибо.

---

<div class="post-metadata">

**Author:** ![andrershov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/andrershov/32/36612_2.png) [@andrershov](https://discuss.elastic.co/u/andrershov)\
**Post date:** [October 19, 2018, 6:55am UTC](https://discuss.elastic.co/t/analyser/152614/10 "2018-10-19T06:55:58Z")

</div>

1. Вам нужно добавить новое поле к маппингу, указав для него желаемый analyzer
2. Используя updateByQuery API скопировать значение поля msg в новое поле [https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html)

---

<div class="post-metadata">

**Author:** ![pavuk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavuk/32/28914_2.png) [@pavuk](https://discuss.elastic.co/u/pavuk)\
**Post date:** [October 19, 2018, 7:44am UTC](https://discuss.elastic.co/t/analyser/152614/11 "2018-10-19T07:44:04Z")

</div>

Спасибо. А вот этот вариант не сработает?

[https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-copy](https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-copy)

---

<div class="post-metadata">

**Author:** ![andrershov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/andrershov/32/36612_2.png) [@andrershov](https://discuss.elastic.co/u/andrershov)\
**Post date:** [October 23, 2018, 1:02pm UTC](https://discuss.elastic.co/t/analyser/152614/12 "2018-10-23T13:02:13Z")

</div>

Я описал, как стоит поступить, если в индексе уже есть данные. Если у вас еще нет индекса, то вам действительно либо нужно посылать два поля в ElasticSearch, либо попробовать воспользоваться [https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html).  
Если у вас есть в индексе данные и плюс вы хотите продолжить писать в этот индекс, тогда придется сделать и то и другое.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [November 20, 2018, 1:02pm UTC](https://discuss.elastic.co/t/analyser/152614/13 "2018-11-20T13:02:17Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
