2015-03-10 17 views
39

Có sự khác biệt nào giữa "truy vấn và bộ lọc trong bộ lọc" và "truy vấn và bộ lọc trên thư mục gốc" không? ví dụElasticsearch Truy vấn đã lọc và Bộ lọc

Trường hợp 1:

{ 
    "query":{ 
    "filtered":{ 
     "query":{ 
     "term":{"title":"kitchen3"} 
     }, 
     "filter":{ 
     "term":{"price":1000} 
     } 
    } 
    } 
} 

Trường hợp 2:

{ 
    "query":{ 
    "term":{"title":"kitchen3"} 
    }, 
    "filter":{ 
    "term":{"price":1000} 
    } 
} 

tôi thấy cuộc thảo luận này http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html, nhưng URL tham chiếu là 404 và giải thích là một chút quá ngắn gọn cho tôi.

Vui lòng dạy hoặc cung cấp bất kỳ tài liệu nào chỉ ra sự khác biệt giữa những điều này, cảm ơn bạn.

+5

http://stackoverflow.com/questions/28937819/filter-inside-or-outside-filtered-query –

Trả lời

34

Sự khác biệt có liên quan đến hiệu suất. "bộ lọc" ở cấp cao nhất luôn được thực thi sau truy vấn. Điều này có nghĩa là truy vấn được thực hiện trên tất cả các tài liệu, điểm số được tính cho tất cả các tài liệu, vv - và chỉ sau đó các tài liệu không phù hợp với bộ lọc được loại trừ.

Với truy vấn "được lọc", có khả năng ES sẽ tối ưu hóa tính toán này, ví dụ: đầu tiên thực hiện bộ lọc, sau đó thực hiện truy vấn trên một bộ tài liệu giới hạn, tiết kiệm thời gian kiểm tra các tài liệu không khớp với bộ lọc so với truy vấn và trên điểm tính toán cho chúng nếu chúng khớp với truy vấn.

Nếu bạn đang thực hiện nhiều truy vấn với cùng một bộ lọc, thì thậm chí còn có nhiều ưu điểm hơn: bộ lọc có thể được lưu trong bộ nhớ cache, cải thiện hiệu suất của từng truy vấn hơn nữa. Điều này áp dụng cho ví dụ của bạn: bộ lọc "thuật ngữ" được lưu trong bộ nhớ cache theo mặc định.

Bạn cũng có thể kiểm soát rõ ràng việc thực hiện truy vấn "được lọc" (xem tài liệu) để tối ưu hóa truy vấn đó cho trường hợp sử dụng cụ thể của bạn.

+0

bạn có thể vui lòng cho tôi biết trong một truy vấn lọc nếu tôi viết bộ lọc trước khi truy vấn sau đó nó sẽ làm cho bất kỳ sự khác biệt trong hiệu suất hay không? –

+1

@SudhanshuGaur thứ tự các khóa trong truy vấn JSON không ảnh hưởng đến kết quả. Bạn có thể kiểm soát chiến lược bộ lọc có thể ảnh hưởng đến hiệu suất tuy nhiên: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filter_strategy –

7

Bộ lọc trong hai loại có thể được gọi là bộ lọc trước và sau. Khi @alexey giải thích, bộ lọc cấp cơ sở được thực hiện sau khi truy vấn và bộ lọc trong truy vấn được lọc được thực hiện trước truy vấn.

Ngoài ra, bạn cần phải hiểu tác động của cùng một thứ tự khác khi đó lệnh được thực thi. Bộ lọc trong truy vấn "được lọc" nằm trong phạm vi truy vấn có nghĩa là trong khi tính tổng hợp, đầu ra được lọc sẽ được xem xét trong trường hợp kết hợp bộ lọc cấp cơ sở sẽ chỉ được thực hiện trên kết quả của truy vấn ngoại trừ bộ lọc. Mặc dù trong cả hai trường hợp, tài liệu kết quả sẽ giống nhau. Ví dụ với hai truy vấn bạn đã đăng, cả hai sẽ cho kết quả tương tự, nhưng nếu bạn đang thực hiện kết hợp thì truy vấn đầu tiên sẽ tính tổng số từ tài liệu phù hợp với tiêu đề kitchen3 và giá 10000 trong khi truy vấn thứ hai sẽ tính tổng số từ các tài liệu phù hợp với tiêu đề kitchen3 chỉ mà không cần lọc giá 1000.

+1

"bộ lọc trong truy vấn được lọc được thực hiện trước truy vấn "- không cần thiết –

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