2012-11-12 35 views
11

Để tham chiếu ở đây là mã. Tôi đang cố gắng tạo một plugin hubot để đăng nhập vào elasticsearch và sau đó sử dụng lệnh hubot để tìm kiếm các nhật ký đó.Làm cách nào để kết hợp nhiều truy vấn trong ElasticSearch

https://gist.github.com/4050748

Tôi đang cố truy xuất các bản ghi khớp với hai truy vấn.

{ 
    query: { 
     match: { 
      user: "SomeUsername" 
     }, 
     range: { 
      date: { 
      from: (Date.now() - 3600) 
      } 
     } 
    }, 
    size: 50 
} 

tôi đã mong đợi:

  • Lên đến 50 hồ sơ
  • hồ sơ mà có người sử dụng cho
  • hồ sơ trong giờ cuối cùng

tôi nhận:

    .210
  • lên đến 10 hồ sơ
  • hồ sơ mà có người sử dụng cho
  • từ bất kỳ thời gian

Làm thế nào để có được tất cả các hồ sơ với một số tên trong giờ cuối cùng? Tôi có cần sử dụng match_all với bộ lọc không? Là những gì tôi đang cố gắng không được hỗ trợ?

Trong SQL nó sẽ là một cái gì đó như:

Select (*) from messages where user_name = ? and time > ? 

Trả lời

15

Bạn cần phải sử dụng bool query kết hợp truy vấn khác nhau với nhau. Sau đó, bạn có thể chọn xem mỗi truy vấn có phù hợp hay không, phải khớp (tùy chọn) hoặc không khớp.

16

Đối với bất cứ ai tình cờ về câu hỏi này và tự hỏi những gì nó trông giống như kết hợp một trận đấu và phạm vi truy vấn trong ElasticSearch, ví dụ này sẽ trông như thế

curl 'localhost:9200/<index>/_search?pretty=true' -d '{ 
    "query" : { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "user": "SomeUsername" 
      } 
     }, 
     { 
      "range" : { 
      "date": { 
       "gt": "now-1h" 
      } 
      } 
     } 
     ] 
    } 
    } 
}' 
+0

lưu tôi một số công việc ở đây - cảm ơn bạn! – JohnJ

+0

Các truy vấn có chạy theo thứ tự chúng được chỉ định không? Như trong, truy vấn phạm vi sẽ được áp dụng cho người dùng được tìm thấy bởi người đầu tiên? –

+0

@EvaldasRaisutis Tôi sẽ giả định dựa trên sự lựa chọn của API để sử dụng một danh sách trong "trận đấu" nhưng tôi không biết chắc chắn. –

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