Как выполнить агрегацию (например, avg) в списке объектов в Elasticsearch? - PullRequest
1 голос
/ 17 марта 2020

У меня есть данные в Elasticsearch в следующей форме:

[
    {
        "id": 1,
        "name": "abc",
        "score": 10,
        "values": [
            {
                "v1": 1,
                "v2": 2
            }
        ]
    },
    {
        "id": 2,
        "name": "def",
        "score": 20,
        "values": [
            {
                "v1": 3,
                "v2": 4
            }
        ]
    }
]

В настоящее время я вычисляю среднее значение по score, используя следующий код:

s = Search(using=es, index=index).query(Q(query))
s.aggs.bucket('average_score', 'avg', field='score') # average_score = 15

Теперь я буду sh для вычисления среднего на v1 и v2 с использованием elasticsearch_dsl, но я не знаю, как выполнить вложенную агрегацию. В этом примере v1 = 2 и v2 = 3. Пожалуйста помоги. Заранее спасибо!

Редактировать: К сожалению, здесь values является объектом вместо вложенного.

1 Ответ

1 голос
/ 18 марта 2020

Не знаю, как это сделать в вашем DSL, но вот необработанные шаги.


Отображение:

PUT avgs/
{
  "mappings": {
    "properties": {
      "values": {
        "type": "nested",
        "properties": {
          "v1": {
            "type": "integer"
          },
          "v2": {
            "type": "integer"
          }
        }
      }
    }
  }
}

Индексирование:

POST avgs/_doc
{
  "id": 1,
  "name": "abc",
  "score": 10,
  "values": [
    {
      "v1": 1,
      "v2": 2
    }
  ]
}

POST avgs/_doc
{
  "id": 2,
  "name": "def",
  "score": 20,
  "values": [
    {
      "v1": 3,
      "v2": 4
    }
  ]
}

Запрос:

GET avgs/_search
{
  "size": 0,
  "aggs": {
    "avg_v1": {
      "nested": {
        "path": "values"
      },
      "aggs": {
        "nested_v1": {
          "avg": {
            "field": "values.v1"
          }
        }
      }
    },
    "avg_v2": {
      "nested": {
        "path": "values"
      },
      "aggs": {
        "nested_v2": {
          "avg": {
            "field": "values.v2"
          }
        }
      }
    }
  }
}

Выход:

...
  "aggregations" : {
    "avg_v2" : {
      "doc_count" : 2,
      "nested_v2" : {
        "value" : 3.0
      }
    },
    "avg_v1" : {
      "doc_count" : 2,
      "nested_v1" : {
        "value" : 2.0
      }
    }
  }
...
...