# Не отрабатывает keyword\_marker фильтр

**URL:** <https://discuss.elastic.co/t/keyword-marker/162021>\
**Category:** Вопросы на русском языке\
**Created:** [December 24, 2018, 6:12pm UTC](https://discuss.elastic.co/t/keyword-marker/162021 "2018-12-24T18:12:45Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![denisovkv](https://avatars.discourse-cdn.com/v4/letter/d/f475e1/32.png) [@denisovkv](https://discuss.elastic.co/u/denisovkv)\
**Post date:** [December 24, 2018, 6:12pm UTC](https://discuss.elastic.co/t/keyword-marker/162021/1 "2018-12-24T18:12:45Z")

</div>

Здравствуйте! Подскажите, пожалуйста, почему не отрабатывает 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  
} ]  
}

* * *

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [December 24, 2018, 7:07pm UTC](https://discuss.elastic.co/t/keyword-marker/162021/2 "2018-12-24T19:07:57Z")

</div>

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

```auto
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`

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

```

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

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

```

Так что все работает, по моему. Возможно, у вас старая версия elasticsearch и вам мешает вот этот [баг](https://github.com/imotov/elasticsearch-analysis-morphology/issues/18) либо вы используете `analyze` как-то некорректно. Но поскольку вы не привели полный пример, который я просто мог бы запустить, то точно сказать не могу.

---

<div class="post-metadata">

**Author:** ![denisovkv](https://avatars.discourse-cdn.com/v4/letter/d/f475e1/32.png) [@denisovkv](https://discuss.elastic.co/u/denisovkv)\
**Post date:** [December 30, 2018, 6:02am UTC](https://discuss.elastic.co/t/keyword-marker/162021/3 "2018-12-30T06:02:24Z")

</div>

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

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

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

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

"filter": ["lowercase", "custom\_stems", "russian\_morphology", "english\_morphology"]

self.DEFAULT\_SETTINGS['settings']['analysis']['filter']['custom\_stems'] = {  
"type": "stemmer\_override",  
"rules": "марьевич=\>чивеьрам"  
}

---

<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:** [January 27, 2019, 6:02am UTC](https://discuss.elastic.co/t/keyword-marker/162021/4 "2019-01-27T06:02:39Z")

</div>

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