ElasticSearch - средний уровень с агрегацией вложенных полей - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь выполнить следующий запрос вasticsearch.Сценарий: у меня есть одно поле в документе, которое имеет 3 подполя: time1, time2 и id, поле представляет собой массив объектов, имеющих вышеуказанные поля.

Я хочу вычислить среднюю разницу ч / б time2 и time1 для всех элементов.

Выполняется запрос:

`{
   "query":{"match_all":{}},
   "aggs":{
      "total_time_diff":{
          "nested":{"path":"diff_list"},
          "aggs":{
              "diff_r":{
                 "sum":"doc['time2'].date.getMills()-doc['time1'].date.getMills()"
              }
          }
      },
      // Here I need average of the sum which is calculated in total_time_diff "sum" aggregation
      "avg_diff":{
        "avg_bucket":{"buckets_path":"total_time_diff"}
      }
   }
 }`

Я получаю следующую ошибку:

{
   "error": {
     "root_cause": [],
     "type": "search_phase_execution_exception",
     "reason": "",
     "phase": "fetch",
     "grouped": true,
     "failed_shards": [],
     "caused_by": {
       "type": "class_cast_exception",
       "reason": "org.elasticsearch.search.aggregations.bucket.nested.InternalNested cannot be cast to org.elasticsearch.search.aggregations.InternalMultiBucketAggregation"
     }
   },
   "status": 503
}

Отображение индекса

{
  "my_index": {
    "mappings": {
      "response_index": {
        "date_detection": false,
          "diff_list": {
            "type": "nested",
            "properties": {
              "age": {
                "type": "long"
              },
              "time2": {
                "type": "date"
              },
              "time1": {
                "type": "date"
              },
              "id": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

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

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

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

Среднее агрегация сегментов здесь не будет работать для этой агрегации одного уровня, поскольку сумма выполнения агрегации не равна мультиагрегации нескольких сегментов .

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

{
    "size": 0,
    "aggs": {
        "total_time_diff": {
            "nested": {
                "path": "diff_list"
            },
            "aggs": {
                "diff_r": {
                    "avg": {
                        "script": {
                            "source": "doc['diff_list.time2'].value.millis - doc['diff_list.time1'].value.millis"
                        }
                    }
                }
            }
        }
    }
}

Надеюсь, это работает для вас.

0 голосов
/ 08 марта 2019
"aggs":{
              "diff_r":{
                 "sum":"doc['time2'].date.getMills()-doc['time1'].date.getMills()"
              }
          }

не является селектором сегментов, и поэтому total_time_diff не будет работать внутри последнего агрегата (avg_diff).

вместо этого используйте скрипт (вроде)

"script": "doc['time2'].date.getMills()-doc['time1'].date.getMills()"

Дайте нам знать, это слово.

...