Объединение Elasticsearch дочерних документов, упорядоченных по количеству родителей - PullRequest
0 голосов
/ 16 октября 2019

Я хочу построить агрегированный список детей, сгруппированных по определенному атрибуту, упорядоченному по количеству родителей, у которых есть ребенок с этим атрибутом.

Пример

Скажем, у меня 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...