Агрегирование терминов по внутреннему объекту и получение метаданных сегмента - PullRequest
1 голос
/ 12 марта 2020

Мы индексируем следующие продукты:

{
    "id": "1",
    "name": "the-name",
    "categories": [
        {
            "id" : 10,
            "name" : "cat-1"
        },
        {
            "id" : 20,
            "name" : "cat-2"
        }
    ]
}

Мы выполняем агрегацию на categories.id, используя:

REQUEST:
//...
"aggs": {
    "by_cat": {
        "terms": {
            "field": "categories.id",
            "size": 10
        }
    }
}

---
RESPONSE:
// ...
"by_cat" : {
    "buckets" : [
    {
        "key" : 10,
        "doc_count" : 804
    },
    {
        "key" : 20,
        "doc_count" : 327
    },

Это работает хорошо, однако, каждое ведро содержит только categories.id в поле key. Мы хотели бы иметь возможность иметь название категории в корзине, например:

// ...
      "buckets" : [
        {
          "key" : 10,
          "metadata": {
              "name": "cat-1"
          },
          "doc_count" : 804
        },
        {
          "key" : 20,
          "metadata": {
              "name": "cat-2"
          },
          "doc_count" : 327
        },

Каков хороший способ сделать это? Мы нашли два, чтобы получить эту информацию, но они оба выглядят «hacki sh»:

  • Используя top_hits с размером 1 и источником, ограниченным категориями, он будет получать по одному документу на каждую корзину, содержащую необходимую нам информацию , Это первое решение не выглядит с точки зрения производительности, и чем больше у нас агрегации, тем более раздутым является ответ.
  • Добавление нового столбца id_name, в котором объединяются id и name, и выполняется термин агрегация для него. Это больше похоже на взлом, и может быть сложным, если много полей.

Мы также пытались смешать поле и скрипт в терминах, но это не помогает.

метаданные выглядели именно так, как мы хотели, но они глобальны для всех сегментов, а не динамичны c.

У нас есть другой способ получить эту информацию?

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