Как правильно установить индекс в Elasticsearch (5.2.0), чтобы использовать транслитерацию и лемматизацию?

Я пытаюсь правильно установить индекс в Elasticsearch (V5.2.0) и использовать преимущества лемматизации. Мой индекс выглядит так:

PUT /icu 
{
"settings":{
    "index":{
        "analysis":{
            "filter":{
                "latin_transform":{
                    "type":"icu_transform",
                    "id":"Any-Latin; Lower()"
                },
                "lemmagen_filter_sr":{
                    "type":"lemmagen",
                    "lexicon":"sr"
                }
            },
            "analyzer":{
                "lemmagen_lowercase_sr":{
                    "filter":[
                        "lemmagen_filter_sr",
                        "latin_transform"
                    ],
                    "type":"custom",
                    "tokenizer":"standard"
                }
            }
        }
    }
}

Я установил https://github.com/vhyza/elasticsearch-analysis-lemmagen но когда я пытаюсь что-то проанализировать, выясняется, что если текст на кириллице, то только яблоки фильтр latin_transform без lemmagen_filter_sr, а если текст на латинице, применяется lemmagen_filter_sr слов правильно.

Вот пример:

POST icu/_analyze
{  
    "analyzer":"lemmagen_lowercase_sr",
    "text":"реду раду и дисциплини redu i disciplini"
}

Я получаю следующее:

{
  "tokens": [
    {
      "token": "redu",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "radu",
      "start_offset": 5,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "i",
      "start_offset": 10,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "disciplini",
      "start_offset": 12,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "red",
      "start_offset": 23,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "i",
      "start_offset": 28,
      "end_offset": 29,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "disciplina",
      "start_offset": 30,
      "end_offset": 40,
      "type": "<ALPHANUM>",
      "position": 6
    }
  ]
}

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


person bigcat    schedule 30.04.2018    source источник


Ответы (1)


После некоторых попыток я нашел обходное решение. Вместо использования двух фильтров в анализаторе я переместил latin_transform в char_filter, сначала выполняя транслитерацию через сопоставление, а затем применяя лемматизацию. новый анализатор теперь выглядит так:

"analysis":{
    "char_filter": {
        "latin_transform": {
            "type": "mapping",
            "mappings_path" : "serbian_mapping.txt"
        }
    },
    "filter":{
        "lemmagen_filter_sr":{
            "type":"lemmagen",
            "lexicon":"sr"
        }
    },
    "analyzer":{
        "lemmagen_lowercase_sr":{
            "filter":[
                "lemmagen_filter_sr",
                "lowercase"
            ],
            "char_filter": ["latin_transform"],
            "type":"custom",
            "tokenizer":"standard"
        }
    }
}

serbian_mapping.txt содержит пары ключей транслитерации, и это решает проблему.

person bigcat    schedule 30.04.2018