У меня есть индекс с продуктами (ES 6.3), где некоторые названия продуктов выглядят так: Tomato
, Tomatosoup
, Tomatojuice
и т. Д. Я пытаюсь достичь, когда я запрашиваю, например, к термину Toma
, чтобы получить совокупность лучших совпадающих терминов вместо полных названий продуктов.
Для этого у меня есть следующее отображение:
{
"name": {
"type": "text",
"analyzer": "custom-ngram" // Defined in the mapping
"search-analyzer": "standard",
"fields": {
"suggestion": {
"type": "text",
"fielddata": true,
"analyzer": "standard"
}
}
}
}
и мой запрос выглядит так:
{
"query": {
"bool": {
"must":{
"multi_match": {
"query": "tom",
"fields": ["name^3", "description"]
}
}
}
},
"aggs": {
"suggestions": {
"terms": {
"field": "name.suggestion",
"include": "tom.*",
"size": 10
}
}
},
"size": 0
}
Действительно, это работает и возвращает мне то, что мне нужно, но у меня есть две проблемы:
- Использование
fielddata
, которое не рекомендуется на основании документов ES
- Использование директивы
includes
для фактической фильтрации групп агрегации
Это правильный путь для решения этой проблемы или подход совершенно неверный? Есть ли лучший метод решения этой проблемы?