# Последовательное применение анализаторов

**URL:** <https://discuss.elastic.co/t/topic/210303>\
**Category:** Вопросы на русском языке\
**Created:** [December 3, 2019, 7:24am UTC](https://discuss.elastic.co/t/topic/210303 "2019-12-03T07:24:09Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Murzin\_Vladimir](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/murzin_vladimir/32/58688_2.png) [@Murzin\_Vladimir](https://discuss.elastic.co/u/Murzin_Vladimir)\
**Post date:** [December 3, 2019, 7:24am UTC](https://discuss.elastic.co/t/topic/210303/1 "2019-12-03T07:24:09Z")

</div>

Есть задача: проиндексировать поле с русским стеммингом, а потом применить фильтр символов.  
Это нужно для того, чтобы была возможность поиска в тексте на русском языке, причем в тексте некоторые символы русского языка заменены на аналогичные по начертанию английские.  
Пробую так:

```
  {
      "settings": {
        "index": {
          "max_ngram_diff": 30
        },
        "analysis": {
          "analyzer": {
            "pstranslit": {
              "tokenizer": "standard",
              "filter": ["lowercase", "russian_stemmer"],
              "char_filter": ["pstranslit_char_filter"]
            }
          },
          "filter": {"russian_stemmer": {
              "type": "stemmer",
              "language": "russian"
            }
    }, 
          "char_filter": {
            "pstranslit_char_filter": {
              "type": "mapping",
              "mappings": [
                "с => c",
                "е => e",
                "т => t",
                "о => o",
                "р => p",
                "а => a",
                "н => h",
                "к => k",
                "х => x",
                "в => b",
                "м => m",
                "у => y",
                "ё => e",
                ", => .",
                "* => x",
                "× => x",
                """\\ => /"""
              ]
            }
          }
        }
      }
    }

```

Фактически, сначала применяется фильтр символов, потом русский стеммер:

```
{"analyzer": "pstranslit",
  "text": "Держателем кабельным зажимным"
}

{
  "tokens" : [
    {
      "token" : "дepжateлem",
      "start_offset" : 0,
      "end_offset" : 10,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "kaбeльhыm",
      "start_offset" : 11,
      "end_offset" : 20,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "зaжиmhыm",
      "start_offset" : 21,
      "end_offset" : 29,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

```

Как сделать наоборот, чтобы сначала стеммер, а потом фильтр символов?  
Может быть, можно сделать 2 анализатора и по очереди их применить к индексируемому значению?

---

<div class="post-metadata">

**Author:** ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)\
**Post date:** [December 3, 2019, 7:38am UTC](https://discuss.elastic.co/t/topic/210303/2 "2019-12-03T07:38:39Z")

</div>

так устроен анализатор: сначала charfilter, затем токенайзер и токен фильтры. Нужен какой то хитрый токенфильтр

---

<div class="post-metadata">

**Author:** ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)\
**Post date:** [December 3, 2019, 9:17am UTC](https://discuss.elastic.co/t/topic/210303/3 "2019-12-03T09:17:01Z")

</div>

похоже что единственное можно чделать это собрать цепочку [https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern\_replace-tokenfilter.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern_replace-tokenfilter.html) по одному фильтру на замену.  
Но есть вопрос зачем. Мне кажется стандартный подход это стеммить русский во время индекса, а в поиске как дополнительный запрос включать анализатор с транслит чар фильтром. причём, eng-\>ru.

---

<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:** [December 31, 2019, 9:17am UTC](https://discuss.elastic.co/t/topic/210303/4 "2019-12-31T09:17:04Z")

</div>

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