2014-09-26 13 views
5

tôi cần phải làm được một số dữ liệu được nhóm theo ngày trong tuần và giờ, ví dụElasticsearch - nhóm theo ngày trong tuần và giờ

curl -XGET http://localhost:9200/testing/hello/_search?pretty=true -d ' 
{ 
     "size": 0, 
     "aggs": { 
      "articles_over_time" : { 
      "date_histogram" : { 
       "field" : "date", 
       "interval" : "hour", 
       "format": "E - k" 
      } 
      } 
     } 
} 
' 

Cung cấp cho tôi điều này:

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2857, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "articles_over_time" : { 
     "buckets" : [ { 
     "key_as_string" : "Fri - 17", 
     "key" : 1391792400000, 
     "doc_count" : 6 
     }, 
    ... 
     { 
     "key_as_string" : "Wed - 22", 
     "key" : 1411596000000, 
     "doc_count" : 1 
     }, { 
     "key_as_string" : "Wed - 22", 
     "key" : 1411632000000, 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 

Bây giờ tôi cần để tóm tắt số lượng tài liệu theo giá trị này "Thứ tư - 22", làm cách nào tôi có thể thực hiện việc này? Có thể một số cách tiếp cận khác?

Trả lời

0

Bạn có thể thử thực hiện kết hợp cụm từ trên trường "key_as_string" từ kết quả tổng hợp bằng cách sử dụng tổng hợp phụ.

Hy vọng điều đó sẽ hữu ích.

1

Cùng một loại sự cố đã được giải quyết trong this thread.

Thích ứng giải pháp cho vấn đề của bạn, chúng tôi cần phải thực hiện một kịch bản để chuyển đổi ngày vào giờ trong ngày và ngày trong tuần:

Date date = new Date(doc['date'].value) ; 
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH'); 
format.format(date) 

Và sử dụng nó trong một truy vấn:

{ 
    "aggs": { 
     "perWeekDay": { 
      "terms": { 
       "script": "Date date = new Date(doc['date'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');format.format(date)" 
      } 
     } 
    } 
} 
0

Điều này là do bạn đang sử dụng một khoảng thời gian 'giờ', nhưng định dạng ngày là 'ngày' (E - k).

Thay đổi khoảng thời gian của bạn thành 'ngày' và bạn sẽ không còn nhận được các nhóm riêng biệt cho 'Thứ tư - 22'.

Hoặc, nếu bạn muốn mỗi giờ, hãy thay đổi định dạng của bạn để bao gồm trường giờ.

+0

Một nhược điểm của giải pháp không phải tập lệnh là bạn nhận được nhiều giá trị mỗi giờ nếu truy vấn kéo dài nhiều ngày, giải pháp hiện tại của tôi là kết hợp điều này ở phía máy khách vì tôi muốn tránh phải mở tập lệnh cho điều này. – centic

+0

Không chắc chắn tôi theo dõi bình luận của bạn :-). Khoảng thời gian và định dạng có liên quan - khoảng thời gian kiểm soát sự thay đổi, định dạng sẽ kiểm soát tên của nhóm. Nếu bạn muốn tất cả tên nhóm là duy nhất, bạn phải đặt định dạng phù hợp. ?! Ngoài ra, bỏ qua 'key_as_string' và sử dụng 'key' thay thế ;-). – RichS

+0

Mục tiêu của tôi là có được lịch sử "giờ trong ngày" trong một khoảng thời gian dài hơn. Nó sẽ cho thấy có bao nhiêu điều xảy ra lúc 1 giờ sáng, lúc 2 giờ sáng, lúc 3 giờ sáng. Bây giờ nếu tôi đặt khoảng thời gian: "giờ" và định dạng: "HH", tôi nhận được các nhóm hàng giờ dự kiến ​​với key_as_string "01", "02", ..., tuy nhiên chúng được lặp lại hàng ngày, vì vậy tôi nhận được nhiều "01 ", và nhiều" 02 ", ... – centic

Các vấn đề liên quan