# Транслит/Фонетика

**URL:** <https://discuss.elastic.co/t/topic/62375>\
**Category:** Вопросы на русском языке\
**Created:** [October 6, 2016, 12:12pm UTC](https://discuss.elastic.co/t/topic/62375 "2016-10-06T12:12:11Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ilya\_Shipilov](https://avatars.discourse-cdn.com/v4/letter/i/e9a140/32.png) [@Ilya\_Shipilov](https://discuss.elastic.co/u/Ilya_Shipilov)\
**Post date:** [October 6, 2016, 12:12pm UTC](https://discuss.elastic.co/t/topic/62375/1 "2016-10-06T12:12:11Z")

</div>

Задача построить такой индекс, который бы успешно находил запись "Johnson's Baby" по запросам "Джонсон с бэби", "Жонсон бэйби".

Мне кажется, что правильно использовать фильтр фонетики, с поддержкой английского и русского языков, чтобы в индексе хранилась некая универсальная транскрипция.

```
 "filter" : {
            "beider_morse": {
                "type" : "phonetic",
                "encoder" : "beider_morse",
                "languageset" : ["russian", "cyrillic", "english"]
            }
         },
   "analyzer" : {
            "phoneticAnalyzer" : {
                "type" : "custom",
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "beider_morse"]
            }
         }

```

Латиница фильтруется:

```
GET /my_index/_analyze?analyzer=phoneticAnalyzer
{
    "text": "Johnson"
}

```

выдает токены: ionzon, zonzon, а для кириллицы результата нет:

```
GET /my_index/_analyze?analyzer=phoneticAnalyzer
{
    "text": "Джонсон"
}

```

выдает только "джонсон".

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

---

<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:** [October 6, 2016, 2:38pm UTC](https://discuss.elastic.co/t/topic/62375/2 "2016-10-06T14:38:06Z")

</div>

Это сложная проблема. Единственное хорошее решение, которое я видел базировалось на машинном обучении. Транслитерация сама по себе не сложна - см тут [https://www.elastic.co/guide/en/elasticsearch/plugins/2.4/analysis-icu-transform.html](https://www.elastic.co/guide/en/elasticsearch/plugins/2.4/analysis-icu-transform.html) Но, когда дело доходит до имен - большое количество исключений и исторически сложившихся написаний все портит.

---

<div class="post-metadata">

**Author:** ![Ilya\_Shipilov](https://avatars.discourse-cdn.com/v4/letter/i/e9a140/32.png) [@Ilya\_Shipilov](https://discuss.elastic.co/u/Ilya_Shipilov)\
**Post date:** [October 6, 2016, 2:55pm UTC](https://discuss.elastic.co/t/topic/62375/3 "2016-10-06T14:55:27Z")

</div>

Игорь, на самом деле у меня вопрос наверное даже проще.

Наши документы это наименования товаров, люди вводят вместо "Johnson's baby", "micro sd" "жонсонов с бэби" и прочее.

Думаю, для нашей задачи попробовать phonetic-filter можно, вот результаты вывода  
org.apache.commons.codec.language.bm.BeiderMorseEncoder#encode (его использует алгоритм beider\_morse) для некоторых вариантов из топа наших запросов:

```
тачскрин: tatskrn|totskrn
touchscreen: DtskrDn|tDtskrn|tDxskrDn|tDxskrn|tDxstzrn|taxskrn|totskrDn|totskrn|toxskrDn|toxskrn|toxstzrn|tutskrDn|tutskrn|tuxskrDn|tuxskrn|tuxstzrn

Intersection: [totskrn]

```

* * *

```
johnson: ionzon|ionzun|xonzon|zonzon
джонсон: zinzon|zonzon
жонсон: zinzon|zonzon

Intersection: [zonzon]

```

Т.е. оно работает, но проблема когда я выполняю индексацию в elastic, русские слова фильтр не обрабатывает (конфиг в предыдущем посте).

---

<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:** [October 6, 2016, 10:44pm UTC](https://discuss.elastic.co/t/topic/62375/4 "2016-10-06T22:44:26Z")

</div>

Я думаю, что это происходит из-за `russian` в списке языков. Судя по списку правил, `russian` работает с русскими фамилиями, написанными латиницей.

> <https://github.com/apache/commons-codec/blob/trunk/src/main/resources/org/apache/commons/codec/language/bm/ash_rules_russian.txt>

В то время как, `cyrillic` содержит правила с транслитерацией

> <https://github.com/apache/commons-codec/blob/trunk/src/main/resources/org/apache/commons/codec/language/bm/ash_rules_cyrillic.txt>

---

<div class="post-metadata">

**Author:** ![Ilya\_Shipilov](https://avatars.discourse-cdn.com/v4/letter/i/e9a140/32.png) [@Ilya\_Shipilov](https://discuss.elastic.co/u/Ilya_Shipilov)\
**Post date:** [October 6, 2016, 11:07pm UTC](https://discuss.elastic.co/t/topic/62375/5 "2016-10-06T23:07:38Z")

</div>

Да, верно, тоже подебажил и обнаружил это, с cyrillic заработало.

Плюс, я неправильно использовал параметр languageset - если задать "cyrillic, english" то фильтроваться будут либо только латинские, либо только кириллические токены, весьма неочевидная оказалась для меня настройка.. Решил двумя фильтрами:

```
"analyzer": {
  "my_analyzer": {
    "tokenizer": "standard",
    "filter": [
      "standard",
      "my_phonetic_english",
      "my_phonetic_cyrillic"
    ]
  }
},
"filter": {
  "my_phonetic_cyrillic": {
    "type": "phonetic",
    "encoder": "beider_morse",
    "rule_type" : "approx",
    "name_type" : "generic",
    "languageset" : ["cyrillic"]
  },
  "my_phonetic_english": {
    "type": "phonetic",
    "encoder": "beider_morse",
    "rule_type" : "approx",
    "name_type" : "generic",
    "languageset" : ["english"]
  }
```

---

<div class="post-metadata">

**Author:** ![Ilya\_Shipilov](https://avatars.discourse-cdn.com/v4/letter/i/e9a140/32.png) [@Ilya\_Shipilov](https://discuss.elastic.co/u/Ilya_Shipilov)\
**Post date:** [October 25, 2016, 3:21am UTC](https://discuss.elastic.co/t/topic/62375/6 "2016-10-25T03:21:24Z")

</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:** [October 25, 2016, 4:29pm UTC](https://discuss.elastic.co/t/topic/62375/7 "2016-10-25T16:29:44Z")

</div>

[http://www.basistech.com/text-analytics/rosette/name-translator/](http://www.basistech.com/text-analytics/rosette/name-translator/)

---

<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:** [July 6, 2017, 1:44pm UTC](https://discuss.elastic.co/t/topic/62375/8 "2017-07-06T13:44:39Z")

</div>


