У вас есть несколько вариантов, но вот два, которые я бы попробовал сначала.
Используйте один запрос с тегами / именованными подзапросами.Как вы можете видеть ниже, в bool/should
мы запрашиваем имена и категории, которые соответствуют some_input
, с небольшим повышением по категориям, поэтому они ранжируются лучше всего и всплывают в результатах.Кроме того, результаты называются либо name_match
, либо category_match
, чтобы вы знали, что это за хиты.Возможно, вы захотите немного поиграть с бустом.Также вам может потребоваться изменить размер, чтобы получить все ожидаемые результаты:
{
"size": 20,
"query": {
"bool": {
"should": [
{
"query": {
"query_string": {
"default_field": "name",
"query": "some_input",
"_name": "name_match"
}
}
},
{
"match": {
"category": {
"query": "some_input",
"boost": 2,
"_name": "category_match"
}
}
}
]
}
}
}
Однако приведенный выше запрос может возвращать одну и ту же категорию несколько раз, а некоторые другие категории вообще не возвращать, в зависимости отразмер вы выбираете.Таким образом, лучшим запросом будет следующий, который использует агрегации для части категории.Он вернет совпадения элементов в разделе совпадений и совпадения уникальных категорий в разделе агрегации:
{
"query": {
"query_string": {
"default_field": "name",
"query": "some_input"
}
},
"aggs": {
"categories": {
"filter": {
"match": {
"category": {
"query": "some_input"
}
}
},
"aggs": {
"categories": {
"terms": {
"field": "category",
"size": 10
}
}
}
}
}
}
ОБНОВЛЕНИЕ
Чтобы вычислить категории для всех данных,Вы можете использовать post_filter
вместо query
:
{
"post_filter": {
"query_string": {
"default_field": "name",
"query": "some_input"
}
},
"aggs": {
"categories": {
"filter": {
"match": {
"category": {
"query": "some_input"
}
}
},
"aggs": {
"categories": {
"terms": {
"field": "category",
"size": 10
}
}
}
}
}
}