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

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

  {
      "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 анализатора и по очереди их применить к индексируемому значению?

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

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

1 Like