2015-06-23 1 views
1

У меня есть некоторые данные из запуска сценариев в моем elasticsearch:Elastic Search: Можно ли агрегировать более чем с одним полем даты?

{ 
"start":"2015-06-15T10:48:01.451Z", 
"resolved":true, 
"cmd":"blabla", 
"lastUpdate":"2015-06-18T11:28:36.866Z", 
"end":"2015-06-17T11:28:35.768Z" 
} 

Моя цель состоит в том, чтобы видеть в течение последних й дней ли работают скрипты. Запускаемые скрипты имеют время начала в поле «start» и время окончания в поле «end». В этом случае я ожидаю такой вид:

{ "date":"2015-06-14", "doc_count":"0", 
    "date":"2015-06-15", "doc_count":"1", 
    "date":"2015-06-16", "doc_count":"1", 
    "date":"2015-06-17", "doc_count":"1", 
    "date":"2015-06-18", "doc_count":"0" 
} 

Возможно ли это реализовать с помощью агрегатов или чего-то еще? Как я могу это построить?

Спасибо за любые предложения!

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

"aggs" : { 
    "range" : { 
     "date_range" : { 
      "field" : "start", 
      "format" : "dd.MM.yyyy", 
      "ranges" : [ 
       {"to": "now", "from": "now/d"}, 
       {"to": "now/d", "from": "now-1d/d"}, 
       {"to": "now-1d/d", "from": "now-2d/d"}, 
       {"to": "now-2d/d", "from": "now-3d/d"}, 
       {"to": "now-3d/d", "from": "now-4d/d"}, 
       {"to": "now-4d/d", "from": "now-5d/d"}, 
       {"to": "now-5d/d", "from": "now-6d/d"} 
      ] 
     } 
    }, 
+0

Я думаю, что возможное решение - использовать сценарии полей в эластичном состоянии. Но на данный момент у меня возникают проблемы с двойными квадратными скобками в возврате запроса. Я не уверен, почему и что является следующим шагом. У меня есть другой билет, потому что скобки [ссылка] (http://stackoverflow.com/questions/31022483/elasticsearch-script-field-answer) – Sven

ответ

0

Для решения этой проблемы я использую скрипт для расчета дней интереса. Вот мой запрос с агрегацией:

"query" : { 
    "filtered" : { 
     "query" : { 
      "bool" : { 
       "should" : [ 
        { "range" : { "lastUpdate" : {"gt" : "now-10d/d"} } }, 
        { "range" : { "start"  : {"gt" : "now-10d/d"} } }, 
        { "range" : { "end"  : {"gt" : "now-10d/d"} } } 
       ] 
      } 
     } 
    } 
}, 
"aggs": { 
    "dates" : { 
     "terms" : { 
      "script_file" : "multidate" 
     } 
    } 
} 

Это связано с documentation.

Я думаю, что сценарий не сделан, но хорошо, как, например:

import groovy.time.TimeCategory 
import groovy.json.* 

def term = [] 
use(TimeCategory) { 

def lastUpdate = doc['lastUpdate'].date.toDate() 
def start  = doc['start'].date.toDate() 
def end  = doc['end'].date.toDate() 

// Start befor end 
    if(start<end) { 
    // lastUpdate only use if after end 
    if(end<lastUpdate&&(lastUpdate-end).days>0) { 
     term.push(lastUpdate) 
    } 
    // days between start and end 
    // same day? 
    if(start.format("dd.MM.yyyy")==end.format("dd.MM.yyyy")) { 
     // same day! 
     term.push(start) 
    } else { 
     // another day 
     diff = end-start 
     for(i=0;i<=diff.days;i++) { 
     term.push(start+i.days) 
     } 
     if((start+diff.days).format("dd.MM.yyyy")!=end.format("dd.MM.yyyy")) { 
     term.push(end) 
     } 
    } 
    } 
} 

text = [] 
for(i in term) { 
    text.add(i.format("dd.MM.yyyy")) 
} 

text 

Thats это! Если я запустил запрос, я получаю:

"aggregations" : { 
    "dates" : { 
     "buckets" : [ { 
     "key" : "18.06.2015", 
     "doc_count" : 2 
     }, { 
     "key" : "19.06.2015", 
     "doc_count" : 2 
     }, { 
     "key" : "25.06.2015", 
     "doc_count" : 2 
     }, { 
     "key" : "17.06.2015", 
     "doc_count" : 1 
     }, { 
     "key" : "22.06.2015", 
     "doc_count" : 1 
     }, { 
     "key" : "23.06.2015", 
     "doc_count" : 1 
     }, { 
     "key" : "30.06.2015", 
     "doc_count" : 1 
     } ] 
    } 
    } 
Смежные вопросы