Я хочу построить агрегированный список детей, сгруппированных по определенному атрибуту, упорядоченному по количеству родителей, у которых есть ребенок с этим атрибутом.
Пример
Скажем, у меня Garage
документы, которые могут иметь много Vehicle
документов в качестве детей:
# Vehicle
{
"data": {
"isCar": true,
"color": "red"
},
"join": {
"parent": "garage:7b387b7b-95cf-44b6-b5a7-619b434b41c5",
"name": "vehicle"
}
}
Я хочу сузить свой запрос до автомобилей (не всех транспортных средств) и получить следующий список в качестве вывода:
[
{
"key" : "red",
"doc_count" : 5
},
{
"key" : "blue",
"doc_count" : 2
},
{
"key" : "white",
"doc_count": 1
}
]
Обратите внимание, что если у данного Garage
есть несколько автомобилей одного цвета, я все равно хочу, чтобы он добавил один к моему желаемому количеству. (В предыдущем списке мог быть один гараж с несколькими белыми машинами.)
Я могу получить что-то похожее на то, что мне нужно, с этим:
GET _search
{
"query": {
"bool": {
"filter": [
{
"term": {
"type": "vehicle"
}
},
{
"term": {
"data.isCar": true
}
}
]
}
},
"aggs": {
"cars": {
"terms": {
"field": "data.color.keyword"
},
"aggs": {
"garages": {
"cardinality": {
"field": "join#garage"
}
}
}
}
}
}
Но он заказанпо числу автомобилей, а не по количеству гаражей с автомобилем заданного цвета. Я могу создать тот же список, начиная мой запрос с родителем и используя агрегацию children
, но я сталкиваюсь с той же проблемой.
Для контекста я использую эластичный поиск 6.5.4