# Обработка запросов в инвертированной раскладке

**URL:** <https://discuss.elastic.co/t/topic/84427>\
**Category:** Вопросы на русском языке\
**Created:** [May 3, 2017, 2:34pm UTC](https://discuss.elastic.co/t/topic/84427 "2017-05-03T14:34:11Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Elena\_Panova](https://avatars.discourse-cdn.com/v4/letter/e/278dde/32.png) [@Elena\_Panova](https://discuss.elastic.co/u/Elena_Panova)\
**Post date:** [May 3, 2017, 2:34pm UTC](https://discuss.elastic.co/t/topic/84427/1 "2017-05-03T14:34:11Z")

</div>

Добрый День,

Помогите, пожалуйста, разобраться в следующем:  
Существует ли в ElasticSearch возможность определять, что запрос введен в неверной раскладке клавиатуры и что поиск по индексу необходимо выполнять по инвертированному запросу в верной раскладке.

Как пример: я хочу найти самокат, но забываю поменять раскладку на клавиатуре и делаю запрос "cfvjrfn". Поскольку в индексе мало (или нет) наименований с таким названием, необходимо преобразовывать данные запрос в "самокат" и делать поиск по инвертированному слову.

Какие есть практики решения данной задачи?

---

<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:** [May 3, 2017, 5:52pm UTC](https://discuss.elastic.co/t/topic/84427/2 "2017-05-03T17:52:28Z")

</div>

Преобразовать из одной раскладки в другую можно с помощью [mapping charfilter](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-mapping-charfilter.html). А проверить если слова с учетов "неправильной" раскладки можно, исползуя анализтор с этим фильтром в [suggester](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/search-suggesters.html).

---

<div class="post-metadata">

**Author:** ![Chakrygin](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/chakrygin/32/16007_2.png) [@Chakrygin](https://discuss.elastic.co/u/Chakrygin)\
**Post date:** [May 10, 2017, 12:34pm UTC](https://discuss.elastic.co/t/topic/84427/3 "2017-05-10T12:34:22Z")

</div>

Я, возможно, не совсем правильно понял идею.  
Допустим, есть слово "самокат". В инвертированной раскладке "cfvjrfn".  
Я проверяю оба слова через suggest:

```
{
  "suggest": {
    "kb_default": {
      "text": "самокат",
      "term": {
        "field": "search_attribute",
        "size": 1
      }
    },
    "kb_inverted": {
      "text": "cfvjrfn",
      "term": {
        "field": "search_attribute",
        "size": 1
      }
    }
  }
}

```

В результате получаю примерно следующее:

```
{
  ...
  "suggest": {
    "kb_default": [
      {
        "text": "самокат",
        "offset": 0,
        "length": 7,
        "options": []
      }
    ],
    "kb_inverted": [
      {
        "text": "cfvjrfn",
        "offset": 0,
        "length": 7,
        "options": []
      }
    ]
  }
}

```

Каким образом ответ suggest-а поможет понять, какое из слов всё таки есть в индексе, а какого нет?  
(Я так понимаю, что если настроить analyzer с mapping charfilter, то результат будет такой же.)

---

<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:** [May 10, 2017, 6:33pm UTC](https://discuss.elastic.co/t/topic/84427/4 "2017-05-10T18:33:25Z")

</div>

Да, действительно, это будет работать только, если слово содержит грамматические ошибки. Надо подумать. Наверное, тогда лучше искать оба варианта и выбрать, тот, который возвращает больше результатов.

```auto
DELETE my_index

PUT my_index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "rus_en_key": {
          "type": "mapping",
          "mappings": [
            "a => ф",
            "b => и",
            "c => с",
            "d => в",
            "e => у",
            "f => а",
            "g => п",
            "h => р",
            "i => ш",
            "j => о",
            "k => л",
            "l => д",
            "m => ь",
            "n => т",
            "o => щ",
            "p => з",
            "r => к",
            "s => ы",
            "t => е",
            "u => г",
            "v => м",
            "w => ц",
            "x => ч",
            "y => н",
            "z => я",
            "A => Ф",
            "B => И",
            "C => С",
            "D => В",
            "E => У",
            "F => А",
            "G => П",
            "H => Р",
            "I => Ш",
            "J => О",
            "K => Л",
            "L => Д",
            "M => Ь",
            "N => Т",
            "O => Щ",
            "P => З",
            "R => К",
            "S => Ы",
            "T => Е",
            "U => Г",
            "V => М",
            "W => Ц",
            "X => Ч",
            "Y => Н",
            "Z => Я",
            "[ => х",
            "] => ъ",
            "; => ж",
            "< => б",
            "> => ю"
            ]
        }
      },
      "analyzer": {
        "rus_en_key_analyzer": {
          "char_filter": [
            "rus_en_key"
          ],
          "tokenizer": "standard",
          "token_filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "my_doc": {
      "properties": {
        "text": {
          "type": "text"
        }
      }
    }
  }
}

PUT my_index/my_doc/_bulk?refresh
{"index":{"_id":1}}
{"text" : "Самокат (скутер, англ. scooter) — наземное средство передвижения, в основном двухколёсное, приводимое в действие путём многократного отталкивания ногой от земли в положении стоя, и управляемое при помощи руля, ранее так называли велосипед"}
{"index":{"_id":2}}
{"text" : "Самокат используется не только в качестве транспорта, но и в качестве средства для развлечения, занятия спортом и физкультурой (тренажёр). Существуют также трёхколёсные инерционные конструкции самокатов с двумя подножками, где разгон происходит при переносе веса тела с одной ноги на другую без отталкивания от земли"}
{"index":{"_id":3}}
{"text" : "Точное время создания самоката неизвестно. Похожие на него изображения встречаются на древних фресках. Есть версия, что самокат впервые был изготовлен в 1761 году в Германии каретным мастером Михаэлем Касслером. По другой версии, самокат создал немецкий изобретатель Карл фон Дрез в 1817 году, и усовершенствовал его в 1820 году, сделав управляемым переднее колесо. Такие самокаты приобрели популярность во Франции и Англии. Английские самокаты, в отличие от немецких, имели железную раму."}

POST my_index/my_doc/_search
{
  "aggs": {
    "keyboard": {
      "filters": {
        "filters": {
          "eng": {
            "match": {
              "text": {
                "query": "cfvjrfn"
              }
            }
          },
          "rus": {
            "match": {
              "text": {
                "query": "cfvjrfn",
                "analyzer": "rus_en_key_analyzer"
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

```

---

<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:** [June 7, 2017, 6:37pm UTC](https://discuss.elastic.co/t/topic/84427/5 "2017-06-07T18:37:08Z")

</div>

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