Как использовать вложенные данные в кибане - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь понять, как преобразовать по существу реляционные данные в формат документа для использования при поиске / визуализации в kibana.

Мне кажется, что мой документ должен выглядеть так:

{
    "order": {
        "id": 123,
        "customer": "bob",
        "email": "robert@bob.com",
        "items": [{
                "id": "xyz",
                "price": 12.2
            }, {
                "id": "abc",
                "price": 13.1
            },
            {
                "id": "abc",
                "price": 13.1
            }
        ]
    }
}

Там, где я не знаю, сколько предметов у меня будет для каждого заказа, поэтому мне нужно, чтобы это была какая-то вложенная структура документа.

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

Но я не вижу, как я могу ответить на вопросы в Кибане, например:

  1. Какова общая стоимость предметов в заказе (38.4)

  2. Каковы различные суммы всех элементов (xyz = 1, abc = 2)

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

Единственный ответ, который я могу придумать, который я стараюсь избегать, заключается в том, что мой документ нуждаетсярассчитать ответы на вопросы, когда они отправлены, чтобы они могли бпоиск ведется как стандартные поля.

Есть ли какие-нибудь указатели на то, что я должен читать?

Заранее спасибо!

1 Ответ

1 голос
/ 13 марта 2019

(очень длинная) агрегация ниже должна ответить на оба ваших вопроса:

{
  "size": 0,
  "aggs": {
    "nested_items": {
      "nested": {
        "path": "items"
      },
      "aggs": {
        "group_by_document": {
          "terms": {
            "field": "_id"
          },
          "aggs": {
            "group_by_item_id": {
              "terms": {
                "field": "items.id"
              },
              "aggs": {
                "total_price_by_item_id": {
                  "sum": {
                    "field": "items.price"
                  }
                }
              }
            },
            "total_price_by_document": {
              "sum_bucket": {
                "buckets_path": "group_by_item_id>total_price"
              }
            }
          }
        }
      }
    }
  }
}

Простыми словами:

  1. nested_items позволяет агрегировать вложенное поле items (см. вложенные агрегации )
  2. group_by_document, ну, в общем, группы по документам с использованием поля _id
  3. group_by_item_id группирует items по их идентификатору
  4. total_price_by_item_id суммирует цены всех товаров с данным items.id определенного документа
  5. total_price_by_document суммирует цены на items.id (см. агрегации конвейеров
...