Умлаут в Упругих Подсказках

В настоящее время я пытаюсь настроить подсказку, подобную исправлению ошибок в Google. Я использую эластичные подсказки со следующим запросом:

{
   "query": {
      "match": {
         "name": "iphone hüle"
      }
   },
   "suggest": {
      "suggest_name": {
         "text": "iphone hüle",
         "term": {
            "field": "name"
         }
      }
   }
}

Это приводит следующие предложения:

"suggest": {
      "suggest_name": [
         {
            "text": "iphone",
            "offset": 0,
            "length": 6,
            "options": []
         },
         {
            "text": "hule",
            "offset": 7,
            "length": 4,
            "options": [
               {
                  "text": "hulle",
                  "score": 0.75,
                  "freq": 162
               },
               ...
               {
                  "text": "hulk",
                  "score": 0.75,
                  "freq": 38
               }
            ]
         }
      ]
   }

Теперь у меня проблема в возвращенном тексте внутри параметров и внутри предложения. Текст, который я отправил, и возвращаемый текст должны быть "hüle", а не "hule". Кроме того, возвращаемый текст опции должен быть "hülle", а не "hulle". Поскольку я использую одни и те же поля для запроса и подсказки, мне интересно, почему умлауты отсутствуют только в подсказчике, а не в результатах обычного запроса.

Смотрите результат запроса здесь:

            "_source": {
               ...
               "name": "Ladegerät für iPhone",
               "manufacturer": "Apple",
            }

1 ответ

Решение

Данные, которые вы возвращаете в результате запроса, т.е.

"name": "Ladegerät für iPhone"

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

Как ни странно, я вчера обсуждал это с коллегой. Мы пришли к выводу, что нам может понадобиться отдельное поле, проиндексированное и не сохраненное, в которое мы индексируем ненормализованные токены. Мы хотим использовать его для получения предложений. Кроме того, это может быть функция, с помощью которой мы можем выполнять точные поиски, то есть поиски, которые действительно делают различия между Мюллером и Мюллером, Фото и Фото, Рене и Рене.

Другие вопросы по тегам