Elasti c поисковый запрос для получения массива значений - PullRequest
0 голосов
/ 28 января 2020

Привет написал запрос для получения среднего значения в позиции в Elasti c search elasti c search payload: "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"
          }
        }
      }
    }
  }
}

Я хочу получить массив элементов, из которых возвращается значение avg. Например, если среднее значение на основе условия «А» равно 42 со значениями {20,10,40,60,80}

В выходных данных необходимо поле, которое может предоставить массив [20,10,40,60,80]

1 Ответ

0 голосов
/ 28 января 2020

Я не думаю, что вы можете получить массив, отформатированный как [20, 10, 40, 60, 80] в ответе на запрос. Я не могу придумать, как получить его с помощью агрегатов или скриптовых полей. Тем не менее, вы можете легко (1) получить эту информацию из того же запроса, который задает агрегаты и логику фильтра; затем (2) постобработайте ответ на запрос, чтобы собрать все значения value, используемые для вычисления среднего значения, отформатировав их так, как вы предпочитаете. То, как вы постобработаете свой ответ, зависит от клиента / сценария, который вы используете для отправки запросов в Elasticsearch.

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

{
  "size": 100,           <-- adjust this upper limit to your use case 
  "_source": "value",    <-- include only the `value` field in the response
  "query": {
    "match": {
      "condition": "A"
    }
  },
  "aggs": {
    "user_avg": {
      "avg": {
        "field": "value"
      }
    }
  }
}

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

{
  "size": 0,
  "_source": "value",
  "query": {
    "match": {
      "condition": "A"
    }
  },
  "aggs": {
    "group_by_values": {
      "terms": {
        "field": "value",
        "size": 100 .       <-- adjust this upper limit to your use case 
      }
    },
    "user_avg": {
      "avg": {
        "field": "value"
      }
    }
  }
}

Результат последнего будет примерно таким:

"aggregations" : {
    "array_of_values" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 50,
          "doc_count" : 2
        },
        {
          "key" : 60,
          "doc_count" : 1
        },
        {
          "key" : 100,
          "doc_count" : 1
        }
      ]
    },
    "user_avg" : {
      "value" : 65.0
    }
  }
...