Как правильно установить индекс на Elasticsearch (5.2.0), чтобы использовать транслитерацию и лемматизацию? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь правильно установить индекс на 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
    }
  ]
}

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

1 Ответ

0 голосов
/ 30 апреля 2018

После нескольких попыток я нашел обходное решение. Вместо того, чтобы использовать два фильтра в анализаторе, я переместил 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 содержит пары ключей транслитерации, и это решает проблему.

...