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
, should
và must_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
}
}
}
}
Tôi phải xây dựng từng mệnh đề theo cách thủ công, sau đó ... – Olivier
minimum_should_match hiện không được dùng nữa –
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