2014-05-22 16 views
19

Làm cách nào để sử dụng bộ lọc có liên quan đến tổng hợp trong elasticsearch?Nhiều bộ lọc và tổng hợp trong elasticsearch

Các tài liệu chính thức cho phép chỉ là ví dụ nhỏ cho filter và cho aggregations và không mô tả chính thức của dsl truy vấn - so sánh nó ví dụ với postgres documentation.

Qua thử tôi thấy truy vấn sau đây, được chấp nhận bởi elasticsearch (không có lỗi phân tích cú pháp), nhưng bỏ qua các bộ lọc đưa ra:

{ 
    "filter": { 
    "and": [ 
     { 
     "term": { 
      "_type": "logs" 
     } 
     }, 
     { 
     "term": { 
      "dc": "eu-west-12" 
     } 
     }, 
     { 
     "term": { 
      "status": "204" 
     } 
     }, 
     { 
     "range": { 
      "@timestamp": { 
      "from": 1398169707, 
      "to": 1400761707 
      } 
     } 
     } 
    ] 
    }, 
    "size": 0, 
    "aggs": { 
    "time_histo": { 
     "date_histogram": { 
     "field": "@timestamp", 
     "interval": "1h" 
     }, 
     "aggs": { 
     "name": { 
      "percentiles": { 
      "field": "upstream_response_time", 
      "percents": [ 
       98.0 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

Một số người đề nghị sử dụng query thay vì filter. Nhưng tài liệu chính thức thường đề xuất the opposite để lọc các giá trị chính xác. Một vấn đề khác với query: trong khi bộ lọc cung cấp and, query thì không.

Ai đó có thể chỉ cho tôi tài liệu, blog hoặc sách mô tả cách viết các truy vấn không tầm thường: ít nhất một bộ lọc tổng hợp cộng với nhiều bộ lọc.

Trả lời

8

Đặt bộ lọc của bạn theo số filtered -query.

Cấp cao nhất filter chỉ dành cho lọc lượt truy cập tìm kiếm chứ không phải các khía cạnh/tập hợp. Nó được đổi tên thành post_filter trong 1.0 do sự nhầm lẫn khá phổ biến này.

Ngoài ra, bạn có thể muốn nhìn vào bài viết này trên lý do tại sao bạn thường muốn sử dụng bool và không and/or: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

24

tôi đã kết thúc bằng một filter aggregation - truy vấn không được lọc. Vì vậy, bây giờ tôi có 3 yếu tố tăng nặng lồng nhau.

tôi cũng sử dụng bool lọc thay vì and như được đề nghị bởi @ alex-brasetvik vì http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

thực hiện cuối cùng của tôi:

{ 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "_type": "logs" 
       } 
      }, 
      { 
       "term": { 
       "dc": "eu-west-12" 
       } 
      }, 
      { 
       "term": { 
       "status": "204" 
       } 
      }, 
      { 
       "range": { 
       "@timestamp": { 
        "from": 1398176502000, 
        "to": 1400768502000 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "aggs": { 
     "time_histo": { 
      "date_histogram": { 
      "field": "@timestamp", 
      "interval": "1h" 
      }, 
      "aggs": { 
      "name": { 
       "percentiles": { 
       "field": "upstream_response_time", 
       "percents": [ 
        98.0 
       ] 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "size": 0 
} 
+4

bạn có thể là người yêu thích của tôi ngay bây giờ. Đã chiến đấu với điều này trong nhiều giờ. – simonmorley

+3

Trong giải pháp này lĩnh vực aggr hàng đầu được đặt tên là "lọc", và điều đó không nên được trộn lẫn với http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html, vì vậy hãy sử dụng một số tên khác (ví dụ như "aggresults") - dưới tên đó bạn sẽ nhận được kết quả trả lời. Vui lòng kiểm tra tham chiếu: http://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html và trả lời http://stackoverflow.com/a/24823895/565525 . –

+0

Làm việc với ES 5.x, chúc mừng !! –

0

thêm về câu trả lời @geekQ 's: để hỗ trợ chuỗi bộ lọc với char không gian, để tìm kiếm nhiều cụm từ, sử dụng bên dưới:

{ "aggs": { 
    "aggresults": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match_phrase": { 
       "term_1": "some text with space 1" 
       } 
      }, 
      { 
       "match_phrase": { 
       "term_2": "some text with also space 2" 
       } 
      } 
      ] 
     } 
     }, 
     "aggs" : { 
      "all_term_3s" : { 
       "terms" : { 
        "field":"term_3.keyword", 
        "size" : 10000, 
        "order" : { 
         "_term" : "asc" 
        } 
       } 
      } 
     } 
    } }, "size": 0 } 
Các vấn đề liên quan