Sự khác biệt của Elaticsearch giữa PHẢI và NÊN truy vấn bool


168

Sự khác biệt giữa MUSTSHOULDtruy vấn bool trong ES là gì?

Nếu tôi CHỈ muốn kết quả có chứa các điều khoản của tôi thì tôi nên sử dụng must?

Tôi có một truy vấn chỉ nên chứa một số giá trị nhất định và cũng không có kết quả nào có ngày / dấu thời gian thấp hơn thời gian / ngày hôm nay - NGAY BÂY GIỜ

Cũng thế

Tôi có thể sử dụng nhiều bộ lọc bên trong phải như mã dưới đây không:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

Câu trả lời:


249

phải có nghĩa là: Mệnh đề (truy vấn) phải xuất hiện trong các tài liệu phù hợp. Các mệnh đề này phải khớp, giống như logic .

nên có nghĩa là: Ít nhất một trong các mệnh đề này phải khớp, như logic OR .

Về cơ bản chúng được sử dụng như các toán tử logic AND và OR. Xem này .

Bây giờ trong một truy vấn bool :

phải có nghĩa là: Các khoản phải phù hợp với tài liệu được đưa vào.

nên có nghĩa là: Nếu các mệnh đề này khớp, chúng sẽ tăng _score; mặt khác, chúng không có tác dụng Chúng chỉ đơn giản được sử dụng để tinh chỉnh điểm phù hợp cho mỗi tài liệu.


Có, bạn có thể sử dụng nhiều bộ lọc bên trong must.


Một chút muộn cho bữa tiệc, nhưng về mustcác loại, hoặc giá cả, và shouldcho các thuộc tính, như kích thước và màu sắc. Bây giờ, nếu kích thước L và XL được chọn, thì nên chọn giữa hai màu đó, nhưng nếu màu xanh lá cây cũng được chọn, thì nó phải có cho (kích thước L HOẶC XL) VÀ (màu xanh lục). Điều đó có thể không?
Mave

Tôi tin rằng các bộ lọc trường hợp đó có thể là một cách tiếp cận tốt hơn cho các thuộc tính. Họ hướng đến các trận đấu chính xác và không tìm kiếm dựa trên mức độ phù hợp. Xem truy vấn và bộ lọc trong tài liệu để biết thêm.
Jim K.

6
Tôi nghĩ bạn cần phải có minimum_number_should_match = 1để thực thi ý tưởng rằng "ít nhất một trong những mệnh đề này phải khớp".
Jim K.

Câu trả lời tốt! Tôi chỉ muốn chia sẻ một phần tài liệu rất hữu ích để tôi hiểu điều này. thun.co / guide / en / elaticsearch / guide / c Hiện / từ
ba0708

1
JimK - hoặc không phải mệnh đề. Khi không có mệnh đề bắt buộc, hàm tối thiểu_number_should_match được ngụ ý.
LizH

15

Vì đây là một câu hỏi phổ biến, tôi muốn thêm rằng trong phiên bản Elaticsearch 2, mọi thứ đã thay đổi một chút.

Thay vì filteredtruy vấn, người ta nên sử dụng booltruy vấn ở cấp cao nhất.

Nếu bạn không quan tâm đến điểm số của mustcác bộ phận, thì hãy đặt những phần đó vào filterkhóa. Không có điểm có nghĩa là tìm kiếm nhanh hơn. Ngoài ra, Elaticsearch sẽ tự động tìm ra, liệu có nên lưu trữ chúng hay không, v.v ... must_notcó giá trị như nhau đối với bộ đệm.

Tham khảo: https://www.elastic.co/guide/en/elSTERearch/reference/civerse/query-dsl-bool-query.html

Ngoài ra, tâm trí "gte": "now"không thể được lưu trữ, vì độ chi tiết mili giây. Sử dụng hai phạm vi trong một mustmệnh đề: một với now/1hvà một phạm vi khác nowđể cái đầu tiên có thể được lưu trong bộ nhớ cache trong một khoảng thời gian và thứ hai để lọc chính xác được tăng tốc trên tập kết quả nhỏ hơn.


8

Như đã nói trong tài liệu :

Phải: Mệnh đề (truy vấn) phải xuất hiện trong các tài liệu phù hợp.

Nên: Mệnh đề (truy vấn) sẽ xuất hiện trong tài liệu phù hợp. Trong một truy vấn boolean không có mệnh đề phải, một hoặc nhiều mệnh đề phải khớp với một tài liệu. Số mệnh đề tối thiểu phải khớp có thể được đặt bằng tham số minim_should_match.

Nói cách khác, kết quả sẽ phải được khớp bởi tất cả các truy vấn có trong mệnh đề must (hoặc khớp ít nhất một trong các mệnh đề nên nếu không có mệnh đề must .

Kể từ khi bạn muốn kết quả của bạn để đáp ứng tất cả các truy vấn, bạn nên sử dụng bắt buộc .


Bạn thực sự có thể sử dụng các bộ lọc bên trong một truy vấn boolean.


10
Tôi nghĩ bạn có nghĩa là "bạn phải sử dụng phải" chứ không phải "bạn nên sử dụng phải" ;-)
jarmod
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.