Не отрабатывает keyword_marker фильтр


(Kirill Denisov) #1

Здравствуйте! Подскажите, пожалуйста, почему не отрабатывает keyword_marker фильтр при использовании russian_morphology в Django-проекте. Elasticsearch 2.4.6

Выдержки из файла настроек:

self.DEFAULT_SETTINGS['settings']['analysis']['filter']['russian_words'] = {
"type": "keyword_marker",
"keywords": ["кошки"]
}

self.DEFAULT_SETTINGS['settings']['analysis']['filter']['russian_stemmer'] = {
"type": "stemmer",
"language": "russian"
}

И различные комбинации фильтров и результатов, которые они выдают:


"filter": [ "lowercase", "russian_stemmer", "english_morphology"]

curl -X GET "localhost:9200/haystack/_analyze/?pretty" -d'
{
"field": "text",
"text": "кошки"

}
'
{
"tokens" : [ {
"token" : "кошк",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
} ]
}


"filter": [ "lowercase", "russian_words", "russian_stemmer", "english_morphology"]

curl -X GET "localhost:9200/haystack/_analyze/?pretty" -d'
{
"field": "text",
"text": "кошки"

}
'
{
"tokens" : [ {
"token" : "кошки",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
} ]
}


"filter": [ "lowercase", "russian_morphology", "english_morphology"]

curl -X GET "localhost:9200/haystack/_analyze/?pretty" -d'
{
"field": "text",
"text": "кошки"

}
'

{
"tokens" : [ {
"token" : "кошка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
} ]
}


"filter": [ "lowercase", "russian_words", "russian_morphology", "english_morphology"]

curl -X GET "localhost:9200/haystack/_analyze/?pretty" -d'
{
"field": "text",
"text": "кошки"

}
'

{
"tokens" : [ {
"token" : "кошка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
} ]
}



(Igor Motov) #2

Когда я запускаю вот это на 5.6

DELETE /test

PUT test
{
  "settings": {
    "analysis": {
      "filter": {
        "russian_words": {
          "type": "keyword_marker",
          "keywords": [
            "кошки"
          ]
        },
        "russian_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      }
    }
  }
}

GET test/_analyze
{
  "tokenizer" : "standard",
  "filter": ["lowercase", "russian_morphology"],
  "text": "кошки"
}

GET test/_analyze
{
  "tokenizer" : "standard",
  "filter": ["lowercase", "russian_words", "russian_morphology"],
  "text": "кошки"
}

я получаю следующее без russian_words

{
  "tokens": [
    {
      "token": "кошка",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

и вот это, когда я добавляю russian_words

{
  "tokens": [
    {
      "token": "кошки",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

Так что все работает, по моему. Возможно, у вас старая версия elasticsearch и вам мешает вот этот баг либо вы используете analyze как-то некорректно. Но поскольку вы не привели полный пример, который я просто мог бы запустить, то точно сказать не могу.


(Kirill Denisov) #3

Для тех, кто еще столкнулся с подобной проблемой, могу предложить следующее решение:

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

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

Решение: применил следующий костыль, используя кастомный стеммер:

"filter": [ "lowercase", "custom_stems", "russian_morphology", "english_morphology"]

self.DEFAULT_SETTINGS['settings']['analysis']['filter']['custom_stems'] = {
"type": "stemmer_override",
"rules": "марьевич=>чивеьрам"
}


(system) closed #4

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