2015-01-17 17 views
33

tôi có một tập hợp các tài liệu nhưLọc đó mảng chứa bất kỳ giá trị cho

{ 
    tags:['a','b','c'] 
    // ... a bunch properties 
} 

Như đã nêu trong tiêu đề: Có cách nào để lọc tất cả các tài liệu có chứa bất kỳ thẻ nào được sử dụng Nest?

Ví dụ: bản ghi ở trên sẽ khớp với ['c', 'd']

Hoặc tôi có nên tạo nhiều "OR" theo cách thủ công không?

Trả lời

25

Chỉnh sửa: Công cụ bitet bên dưới có thể là một cách đọc thú vị, nhưng câu trả lời chính nó là một chút ngày. Một số chức năng này đang thay đổi trong khoảng 2.x. Ngoài ra Slawek chỉ ra một câu trả lời khác là truy vấn terms là một cách dễ dàng để DÙY tìm kiếm trong trường hợp này. Được cấu trúc lại ở cuối để thực hành tốt nhất hiện tại. —nz

Có thể bạn sẽ muốn có một Bool Query (hoặc nhiều khả năng là Filter cùng với truy vấn khác), với mệnh đề là should.

Truy vấn bool có ba thuộc tính chính: must, shouldmust_not. Mỗi trong số này chấp nhận một truy vấn khác hoặc một loạt các truy vấn. Tên khoản là khá tự giải thích; trong trường hợp của bạn, mệnh đề should có thể chỉ định bộ lọc danh sách, một kết quả phù hợp với bất kỳ bộ lọc nào trong số đó sẽ trả lại tài liệu mà bạn đang tìm kiếm.

Từ các tài liệu:

Trong một truy vấn boolean không có must khoản, một hoặc nhiều should khoản phải phù hợp với một tài liệu. Số lượng điều khoản tối thiểu cần khớp có thể được đặt bằng thông số minimum_should_match.

Dưới đây là một ví dụ về những gì mà truy vấn Bool có thể trông như trong sự cô lập:

{ 
    "bool": { 
    "should": [ 
     { "term": { "tag": "c" }}, 
     { "term": { "tag": "d" }} 
    ] 
    } 
} 

Và đây là một ví dụ về truy vấn Bool như một bộ lọc trong vòng một nhiều mục đích chung Filtered Query:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "bool": { 
     "should": [ 
      { "term": { "tag": "c" }}, 
      { "term": { "tag": "d" }} 
     ] 
     } 
    } 
    } 
} 

Cho dù bạn sử dụng Bool làm truy vấn (ví dụ, để tác động đến điểm số của trận đấu), hoặc làm bộ lọc (ví dụ: để giảm số lần truy cập sau đó được ghi hoặc bị lọc) là chủ quan, tùy thuộc vào equirements.

Thông thường, sử dụng Bool có lợi cho một số Or Filter, trừ khi bạn có lý do để sử dụng và/hoặc/không (lý do đó tồn tại). Blog Elasticsearch có thêm thông tin về các cách triển khai khác nhau của từng ứng dụng và các ví dụ hay về thời điểm bạn có thể thích Bool hơn và/hoặc/không và ngược lại.

Elasticsearch blog: All About Elasticsearch Filter Bitsets

Cập nhật với một truy vấn refactored ...

Bây giờ, với tất cả các rằng ra khỏi đường, truy vấn terms là một phiên bản máy sấy của tất cả các ở trên.Điều này phù hợp với loại truy vấn dưới mui xe, nó hoạt động giống như bool + should sử dụng các tùy chọn minimum_should_match và tổng thể hơn một chút nữa.

Dưới đây là truy vấn cuối cùng refactored một chút:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "terms": { 
     "tag": [ "c", "d" ], 
     "minimum_should_match": 1 
     } 
    } 
    } 
} 
+0

Tôi phải xây dựng từng mệnh đề theo cách thủ công, sau đó ... – Olivier

+2

minimum_should_match hiện không được dùng nữa –

+0

minimum_should_match sẽ không giải quyết được sự cố, nếu bạn cũng lọc theo mảng khác, nơi bạn cần hành vi "hoặc" bình thường. – Innokenty

35

Ngoài ra còn có terms query mà nên giúp bạn tiết kiệm một số công việc. Dưới đây là ví dụ từ tài liệu:

{ 
    "terms" : { 
     "tags" : [ "blue", "pill" ], 
     "minimum_should_match" : 1 
    } 
} 

Dưới mui xe, nó sẽ tạo nên boolean. Vì vậy, về cơ bản nó giống như trên nhưng ngắn hơn.

Ngoài ra còn có terms filter tương ứng.

Vì vậy, để tóm tắt câu hỏi của bạn có thể trông như thế này:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "terms": { 
     "tags": ["c", "d"] 
     } 
    } 
    } 
} 

Với số lượng lớn các thẻ này có thể làm cho một sự khác biệt khá dài.

+1

Tôi gặp sự cố khi làm việc này. Bạn có nhớ kiểm tra xem nó ở đây không http://stackoverflow.com/questions/32252789/elastic-search-rails-combine-multi-match-and-filter –

+5

'minimum_should_match' không được chấp nhận và sẽ không thành công. –

+0

@AinTohvri thực sự trong elasticsearch 2.0.1 minimum_should_match vẫn đang hoạt động và tài liệu chính thức không đánh dấu là không được chấp nhận. – Sinux

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