Elasti c поисковый запрос для avg на основе условия - PullRequest
1 голос
/ 09 января 2020

Я написал elasti c поисковый запрос, полезная нагрузка которого выглядит как

"userData": [{"sub": 1234, "value": 678, "condition": "A "}, {" sub ": 1234," value ": 678," condition ":" B "}]

Запрос:

{ 
  "aggs": { 
    "student_data": { 
      "date_histogram": { 
        "field":"@timestamp",
        "calendar_interval":"minute"
      },
      "aggs": { 
        "user_avg": { 
          "avg": { 
            "field":"value"
          }
        }
      }
    }
  }
}

Результат дает среднее значение для обоих значений, т. е. для условия A и для условия B, а также того, что я на самом деле хочу, это avg для только условия B на основе периода времени для минимального интервала.

1 Ответ

1 голос
/ 09 января 2020

Исходя из вашей полезной нагрузки, я предполагаю, userData - это тип nested.

Это рабочий пример того, как усреднить каждое отдельное условие (вложенное внутреннее):

Отображение

PUT my_index
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "userData": {
        "type": "nested",
        "properties": {
          "condition": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "sub": {
            "type": "long"
          },
          "value": {
            "type": "long"
          }
        }
      }
    }
  }
}

Индексировать несколько документов

PUT my_index/_doc/1
{
  "@timestamp": "2019-11-08T11:15:24.188Z",
  "userData": [
    {
      "sub": 1234,
      "value": 678,
      "condition": "A"
    },
    {
      "sub": 1234,
      "value": 620,
      "condition": "B"
    }
  ]
}

PUT my_index/_doc/2
{
  "@timestamp": "2019-11-08T11:15:44.188Z",
  "userData": [
    {
      "sub": 1234,
      "value": 680,
      "condition": "A"
    },
    {
      "sub": 1234,
      "value": 640,
      "condition": "B"
    }
  ]
}

Поисковый запрос

GET my_index/_search
{
  "size": 0,
  "aggs": {
    "student_data": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "minute"
      },
      "aggs": {
        "data": {
          "nested": {
            "path": "userData"
          },
          "aggs": {
            "condition": {
              "terms": {
                "field": "userData.condition.keyword"
              }, 
              "aggs": {
                "user_avg": {
                  "avg": {
                    "field": "userData.value"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Результаты

"student_data" : {
  "buckets" : [
    {
      "key_as_string" : "2019-11-08T11:15:00.000Z",
      "key" : 1573211700000,
      "doc_count" : 2,
      "data" : {
        "doc_count" : 4,
        "condition" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : "A",
              "doc_count" : 2,
              "user_avg" : {
                "value" : 679.0
              }
            },
            {
              "key" : "B",
              "doc_count" : 2,
              "user_avg" : {
                "value" : 630.0
              }
            }
          ]
        }
      }
    }
  ]
}

Надеюсь, это поможет

...