2015-02-27 19 views
72

Sự khác nhau giữa các truy vấn bool MUSTSHOULD bool trong ES là gì?Sự khác biệt về Elasticsearch giữa PHẢI và NÊN truy vấn bool

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

Tôi có một truy vấn mà chỉ nên chứa các giá trị nhất định, và cũng không có kết quả rằng có một ngày/timestamp thấp hơn so với ngày nay thời gian/ngày - VỚI DOANH NGHIỆP

Cũng

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

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

Trả lời

95

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

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

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

Bây giờ trong một bool query:

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

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


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

+0

Một chút muộn cho bên, nhưng làm thế nào về 'phải' cho loại, hoặc giá cả, và' nên' cho 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, đó là một nên giữa hai, nhưng nếu màu xanh lá cây cũng được chọn, nó phải là một phải có (kích cỡ L HOẶC XL) VÀ (màu xanh lá cây). Điều đó có thể không? – Mave

+0

Tôi tin rằng trong trường hợp đó _filters_ có thể là một cách tiếp cận tốt hơn cho các thuộc tính. Chúng được hướng đến các đối sánh chính xác và không dựa trên các tìm kiếm dựa trên mức độ liên quan. Xem [truy vấn và bộ lọc] (http://www.elastic.co/guide/en/elasticsearch/guide/master/_queries_and_filters.html) trong tài liệu để biết thêm thông tin. –

+2

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

3

Như đã nói trong documentation:

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

Nên: Điều khoản (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 phù hợp với một tài liệu. Số lượng tối thiểu của mệnh đề cần khớp có thể được đặt bằng tham số minimum_should_match.

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

Vì 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 phải.


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

+2

Tôi nghĩ bạn có nghĩa là "bạn phải sử dụng phải" thay vì "bạn nên sử dụng phải" ;-) – jarmod

9

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

Thay vì truy vấn filtered, bạn nên sử dụng truy vấn bool ở cấp cao nhất.

Nếu bạn không quan tâm đến số điểm must phần, hãy đặt các bộ phận đó vào khóa filter. Không có điểm có nghĩa là tìm kiếm nhanh hơn. Ngoài ra, Elasticsearch sẽ tự động tìm ra, cho dù để lưu trữ chúng, vv must_not là không kém hợp lệ cho bộ nhớ đệm.

tham khảo: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

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

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