2015-11-30 3 views
0

Учитывая следующий документ поиска elasticsearch, как бы я построил поиск, который бы суммировал значения столбца секунд для заданного диапазона дат-времени?суммируя кучу значений с учетом условия в elasticsearch

См. Ниже мой текущий запрос.

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "searchdb", 
     "_type": "profile", 
     "_id": "1825", 
     "_score": 1, 
     "_source": { 
      "id": 1825, 
      "market": "Chicago", 
      "geo_location": { 
      "lat": 41.1234, 
      "lon": -87.5678 
      }, 
      "hourly_values": [ 
      { 
       "datetime": "1997-07-16T19:00:00.00+00:00", 
       "seconds": 1200 
      }, 
      { 
       "datetime": "1997-07-16T19:20:00.00+00:00", 
       "seconds": 1200 
      }, 
      { 
       "datetime": "1997-07-16T19:20:00.00+00:00", 
       "seconds": 1200 
      } 
      ] 
     } 
     }, 
     { 
     "_index": "searchdb", 
     "_type": "profile", 
     "_id": "1808", 
     "_score": 1, 
     "_source": { 
      "id": 1808, 
      "market": "Chicago", 
      "geo_location": { 
      "lat": 41.1234, 
      "lon": -87.5678 
      }, 
      "hourly_values": [ 
      { 
       "datetime": "1997-07-16T19:00:00.00+00:00", 
       "seconds": 900 
      }, 
      { 
       "datetime": "1997-07-16T19:20:00.00+00:00", 
       "seconds": 1200 
      }, 
      { 
       "datetime": "1997-07-16T19:20:00.00+00:00", 
       "seconds": 800 
      } 
      ] 
     } 
     } 
    ] 
    } 

Ниже мой текущий запрос. Проблема заключается в том, что он не учитывает поле datetime. Мне нужно иметь возможность суммировать только значения секунд, которые попадают в заданный диапазон времени в запросе.

{ 
    "aggs": { 
     "Ids": { 
      "terms": { 
       "field": "id", 
       "size": 0 
      }, 
      "aggs": { 
       "Nesting": { 
        "nested": { 
         "path": "hourly_values" 
        }, 
        "aggs": { 
         "availability": { 
          "sum": { 
           "field": "hourly_values.seconds" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Я знаю, что вы можете использовать диапазон, что-то вроде этого:

"filter" : { 
       "range" : { "timestamp" : { "from" : "now/1d+9.5h", "to" : "now/1d+16h" }} 
      } 

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

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

ответ

1

Я думаю, что это может быть сделано с filter aggregation

Попробуйте

{ 
    "aggs": { 
    "Ids": { 
     "terms": { 
     "field": "id", 
     "size": 0 
     }, 
     "aggs": { 
     "Nesting": { 
      "nested": { 
      "path": "hourly_values" 
      }, 
      "aggs": { 
      "filtered_result": { 
       "filter": { 
       "query": { 
        "range": { 
        "hourly_values.datetime": { 
         "gt": "1997-07-16T19:10:00.00+00:00", 
         "lt": "1997-07-16T19:22:00.00+00:00" 
        } 
        } 
       } 
       }, 
       "aggs": { 
       "availability": { 
        "sum": { 
        "field": "hourly_values.seconds" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "size": 0 
} 

Результат я получаю

"aggregations": { 
     "Ids": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "1808", 
       "doc_count": 1, 
       "Nesting": { 
        "doc_count": 3, 
        "filtered_result": { 
        "doc_count": 2, 
        "availability": { 
         "value": 2000 
        } 
        } 
       } 
      }, 
      { 
       "key": "1825", 
       "doc_count": 1, 
       "Nesting": { 
        "doc_count": 3, 
        "filtered_result": { 
        "doc_count": 2, 
        "availability": { 
         "value": 2400 
        } 
        } 
       } 
      } 
     ] 
     } 
    } 

ли эта помощь?

+0

К сожалению, это возвращает '' Найдено два определения типа агрегации в [Nesting]: [вложенные] и [filter] ". Я часто получаю эту ошибку при попытке использовать различные способы добавления в диапазон. – Arel

+1

Прошу прощения, я не пробовал это на своей машине. – ChintanShah25

+1

Думаю, я сделал это. Пожалуйста, посмотрите мой обновленный ответ – ChintanShah25

Смежные вопросы