Умлаут в Упругих Подсказках
В настоящее время я пытаюсь настроить подсказку, подобную исправлению ошибок в 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"
хранится содержимое поля. Это именно ваши исходные данные. Тем не менее, поиск и, очевидно, также подсказчик, работают с инвертированным индексом, который содержит токены, массируемые анализатором. Скорее всего, вы используете анализатор, который складывает умлауты.
Как ни странно, я вчера обсуждал это с коллегой. Мы пришли к выводу, что нам может понадобиться отдельное поле, проиндексированное и не сохраненное, в которое мы индексируем ненормализованные токены. Мы хотим использовать его для получения предложений. Кроме того, это может быть функция, с помощью которой мы можем выполнять точные поиски, то есть поиски, которые действительно делают различия между Мюллером и Мюллером, Фото и Фото, Рене и Рене.