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


(Elena Panova) #1

Добрый День,

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

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

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


(Igor Motov) #2

Преобразовать из одной раскладки в другую можно с помощью mapping charfilter. А проверить если слова с учетов "неправильной" раскладки можно, исползуя анализтор с этим фильтром в suggester.


(Igor Chakrygin) #3

Я, возможно, не совсем правильно понял идею.
Допустим, есть слово "самокат". В инвертированной раскладке "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, то результат будет такой же.)


(Igor Motov) #4

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

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
}

(system) #5

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