# Русская морфология

**URL:** https://discuss.elastic.co/t/topic/41386
**Category:** Вопросы на русском языке
**Created:** [February 10, 2016, 2:24pm UTC](https://discuss.elastic.co/t/topic/41386 "2016-02-10T14:24:18Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [February 10, 2016, 2:24pm UTC](https://discuss.elastic.co/t/topic/41386/1 "2016-02-10T14:24:18Z")

</div>

Здравствуйте.  
Я использую ES версии 1.7.0 + elasticsearch-analysis-morphology (полагаю, версии 1.2.1).  
В настройках я имею:

```
"analyzer": {
"ru_analyzer": {
"filter": [
"lowercase",
"russian_morphology",
"english_morphology",
"my_stopwords"
],
"type": "custom",
"tokenizer": "standard"
}
}
```
Мапинг для типа:
```
"name": {
  "type": "string",
  "store": true,
  "analyzer": "ru_analyzer"
}
```
Проблема заключается в поиске русских слов по корню с одним или несколькими суффиксами и окончанием. Например, имеем name="Парковые территории". В поисковую строку вводим "парк" и видим пустой результат; вводим "парков" - запись найдена. Standart токенайзер разбирает "Парковые" на "парков", но при этом "Важнейшие" он разберет до "важн". Как можно решить мою проблему?

---

<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: [February 10, 2016, 11:22pm UTC](https://discuss.elastic.co/t/topic/41386/2 "2016-02-10T23:22:29Z")

</div>

Я думаю, что этот вопрос лучше всего задать автору русского морфологического анализатора тут - [https://github.com/AKuznetsov/russianmorphology](https://github.com/AKuznetsov/russianmorphology)

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [February 11, 2016, 8:07am UTC](https://discuss.elastic.co/t/topic/41386/3 "2016-02-11T08:07:48Z")

</div>

Понимаю, что лучше обратиться к первоисточнику. Но даже если будут исправления на том уровне, то все равно нужно будет их как-то перенести в плагин Эластика. Даже если все получится, то это займет много времени.  
Интересует возможность решить проблему каким-то обходным путем, если это возможно. Я лично вижу два варианта: EdgeNGram, но тогда мы будем получать в результатах много лишнего; и второй - пополняемый словарь синонимов для search-анализатора, т.е. ru\_analyzer использовать для индекса, а к разобранной строке поиска подмешивать нужные токены из словаря. Второй вариант кажется вполне удачным, если я правильно понял, что в этом случае не придется пересоздавать индексы после пополнения словаря. Поправьте меня, пожалуйста, если я неправ, или может подскажете еще варианты решения.

---

<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: [February 11, 2016, 3:41pm UTC](https://discuss.elastic.co/t/topic/41386/4 "2016-02-11T15:41:33Z")

</div>

Вы не могли бы описать более подробнее, что вы подразумеваете под

> Проблема заключается в поиске русских слов по корню с одним или несколькими суффиксами и окончанием.

Из двух негативных примеров, которые вы привели, не понятно, какой результат вы ожидаете. Хотелось бы увидеть описание поведения анализатора, которое вы хотите воплотить или хотя бы больше примеров того, как этот анализатор должен работать.

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 9, 2016, 7:22pm UTC](https://discuss.elastic.co/t/topic/41386/5 "2016-03-09T19:22:35Z")

</div>

Сейчас я частично реализовал второй вариант. Настройки сейчас такие:  
"analyzer": {  
"ru\_search\_analyzer": {  
"type": "custom",  
"filter": [  
"lowercase",  
"my\_stopwords",  
"my\_synonyms",  
"russian\_morphology",  
"english\_morphology"  
],  
"tokenizer": "standard"  
},  
"ru\_analyzer": {  
"filter": [  
"lowercase",  
"my\_stopwords",  
"russian\_morphology",  
"english\_morphology"  
],  
"type": "custom",  
"tokenizer": "standard"  
}  
}  
...  
"filter": {  
"my\_synonyms": {  
"type": "synonym",  
"synonyms" : ["парк =\> парков"]  
}  
Т.е. имеем два анализатора - один для индексации, второй для поиска(search\_analyzer в маппинге), в котором слово "парк" заменяется на "парков", а далее фильтром морфологии получаем и парк, и парковый - все работает как задумано. Но я столкнулся с проблемой подключения файла словаря в настройках - "synonyms\_path": "synonyms.txt" - не подхватывает файл "synonyms.txt" из папки config. В чем может быть проблема? ОС Windows.

---

<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: [March 9, 2016, 7:28pm UTC](https://discuss.elastic.co/t/topic/41386/6 "2016-03-09T19:28:31Z")

</div>

> [@glukhovd](#):
>
> не подхватывает файл "synonyms.txt" из папки config

А что он при этом говорит и пишет в логи?

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 9, 2016, 7:58pm UTC](https://discuss.elastic.co/t/topic/41386/7 "2016-03-09T19:58:44Z")

</div>

В логах:  
"... nested: FailedToResolveConfigException[Failed to resolve config path [synonyms.txt], tried file path [synonyms.txt], path file [C:\elasticsearch\config\synonyms.txt], and classpath];"

---

<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: [March 9, 2016, 8:03pm UTC](https://discuss.elastic.co/t/topic/41386/8 "2016-03-09T20:03:10Z")

</div>

И файл `C:\elasticsearch\config\synonyms.txt` существует и доступен для чтения? Как вы запускаете elasticsearch и какую версию elasticsearch, Windows и Java вы используете?

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 9, 2016, 8:11pm UTC](https://discuss.elastic.co/t/topic/41386/9 "2016-03-09T20:11:42Z")

</div>

Да, файл конечно существует и доступен, в нем одна строка - "парк =\> парков". Elasticsearch версии 1.7.0 запускается автоматически как windows service (c:\elasticsearch\bin\elasticsearch-service-x64.exe //RS//elasticsearch-service-x64) под Windows 7 и Java версии 8.45

---

<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: [March 9, 2016, 8:57pm UTC](https://discuss.elastic.co/t/topic/41386/10 "2016-03-09T20:57:00Z")

</div>

> [@glukhovd](#):
>
> Да, файл конечно существует и доступен

Доступен кому? Вам или пользователю, под которым windows service запущен?

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 9, 2016, 8:57pm UTC](https://discuss.elastic.co/t/topic/41386/11 "2016-03-09T20:57:31Z")

</div>

Всем полный доступ, чтоб наверняка исключить эту причину.

---

<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: [March 9, 2016, 9:14pm UTC](https://discuss.elastic.co/t/topic/41386/12 "2016-03-09T21:14:18Z")

</div>

Странно. К сожалению, у меня нет под рукой машины с Windows 7 что бы попробовать и посмотреть, что там происходит, но судя по описанию похоже на баг. Завтра на Windows 10 попробую воспроизвести. А вы полный путь к файлу задавать не пробовали?

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 10, 2016, 7:22am UTC](https://discuss.elastic.co/t/topic/41386/13 "2016-03-10T07:22:15Z")

</div>

Попробовал такой вариант: `"synonyms_path" : "C:\elasticsearch\config\synonyms.txt"` - индекс вообще не создается с аналогичной ошибкой.

---

<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: [March 10, 2016, 3:51pm UTC](https://discuss.elastic.co/t/topic/41386/14 "2016-03-10T15:51:29Z")

</div>

У вас сколько машин в кластере? Этот файл присутствует на каждой машине?

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 11, 2016, 7:35am UTC](https://discuss.elastic.co/t/topic/41386/15 "2016-03-11T07:35:56Z")

</div>

Как я могу узнать сколько машин в кластере? А лучше сразу бы узнать, как ограничить кластер единственной машиной?

---

<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: [March 11, 2016, 1:28pm UTC](https://discuss.elastic.co/t/topic/41386/16 "2016-03-11T13:28:20Z")

</div>

> [@glukhovd](#):
>
> Как я могу узнать сколько машин в кластере?

`curl "localhost:9200/_cluster/health?pretty"`

> [@glukhovd](#):
>
> А лучше сразу бы узнать, как ограничить кластер единственной машиной?

Не запускать elasticsearch с тем же именем кластера на других машинах. Либо добавить следующее в elastcisearch.yml.

```auto
node.max_local_storage_nodes: 1
network.host: "127.0.0.1"
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
discovery.zen.ping.multicast.enabled: false

```

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 28, 2016, 4:42pm UTC](https://discuss.elastic.co/t/topic/41386/17 "2016-03-28T16:42:24Z")

</div>

Добавил указанные вами настройки в elastcisearch.yml - индекс создался без ошибок, в логах нет упоминаний про synonyms.txt, но синонимы из файла все равно не работают, судя по \_analyze.

---

<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: [March 28, 2016, 5:42pm UTC](https://discuss.elastic.co/t/topic/41386/18 "2016-03-28T17:42:25Z")

</div>

А можно на вывод следующих команд посмотреть?

```auto
curl localhost:9200/ИМЯ_ИНДЕКСА

```

и

```auto
curl localhost:9200/ИМЯ_ИНДЕКСА/_analyze -d '{
 ... ваш тест анализатора ...
}'

```

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 29, 2016, 7:51am UTC](https://discuss.elastic.co/t/topic/41386/19 "2016-03-29T07:51:00Z")

</div>

```
{
   "opod": {
      "aliases": {},
      "mappings": {
         "ds1465": {
            "_all": {
               "enabled": true,
               "index_analyzer": "ru_analyzer",
               "search_analyzer": "ru_search_analyzer"
            },
            "properties": {
               "Id": {
                  "type": "string"
               },
               "address": {
                  "type": "string",
                  "store": true,
                  "index_analyzer": "ru_analyzer",
                  "search_analyzer": "ru_search_analyzer",
                  "search_quote_analyzer": "ru_analyzer"
               },
               "caption": {
                  "type": "string",
                  "store": true,
                  "index_analyzer": "ru_analyzer",
                  "search_analyzer": "ru_search_analyzer",
                  "search_quote_analyzer": "ru_analyzer"
               }
            }
         }
      },
      "settings": {
         "index": {
            "creation_date": "1459182850853",
            "analysis": {
               "filter": {
                  "my_synonyms": {
                     "type": "synonym",
                     "synonyms_path" : "synonyms.txt"
                  },
                  "my_stopwords": {
                     "type": "stop",
                     "stopwords": "а,без,более,бы ..."
                  }
               },
               "analyzer": {
                  "ru_search_analyzer": {
                     "type": "custom",
                     "filter": [
                        "lowercase",
                        "my_stopwords",
                        "russian_morphology",
                        "english_morphology",
                        "my_synonyms"
                     ],
                     "tokenizer": "standard"
                  },
                  "ru_analyzer": {
                     "filter": [
                        "lowercase",
                        "my_stopwords",
                        "russian_morphology",
                        "english_morphology"
                     ],
                     "type": "custom",
                     "tokenizer": "standard"
                  }
               }
            },
            "number_of_shards": "1",
            "number_of_replicas": "0",
            "version": {
               "created": "1070099"
            },
            "uuid": "tw5CL8QZSqSdFEEGqv93xg"
         }
      },
      "warmers": {}
   }
}

```

Результат analyze для анализатора ru\_search\_analyzer по слову "парк":

```
<ALPHANUM>
```

  
Если в настройках вместо synonyms\_path указать  
`"synonyms": ["парк => парк, парковый"]`  
то анализатор покажет:
```
{
"tokens": [
{
"token": "парк",
"start_offset": 2,
"end_offset": 6,
"type": "SYNONYM",
"position": 1
},
{
"token": "парковый",
"start_offset": 2,
"end_offset": 6,
"type": "SYNONYM",
"position": 1
}
]
}
```
  
В файле соответственно та же строчка: парк =\> парк, парковый

---

<div class="post-metadata">

### Author: ![glukhovd](https://avatars.discourse-cdn.com/v4/letter/g/65b543/32.png) [@glukhovd](https://discuss.elastic.co/u/glukhovd)
#### Post date: [March 30, 2016, 10:41am UTC](https://discuss.elastic.co/t/topic/41386/20 "2016-03-30T10:41:36Z")

</div>

Игорь, есть ли какие-то мысли? Возможно, обновление до последней версии поможет?

[Next page](https://discuss.elastic.co/t/topic/41386.md?page=2)
