Truy vấn so với Bộ lọc


198

Tôi không thể thấy bất kỳ mô tả nào về thời điểm tôi nên sử dụng truy vấn hoặc bộ lọc hoặc kết hợp cả hai. sự khác biệt giữa chúng là gì? Bất cứ ai có thể giải thích?


46
Trên thực tế, tài liệu chính thức không rõ ràng lắm
geekazoid

2
Có vẻ như đã xuất hiện một trang với lời giải thích nâng cao hơn: thun.co / guide / en / elaticsearch / guide / master / ám
Dmitry Polushkin

6
Đáng lưu ý rằng các truy vấn và bộ lọc sẽ được hợp nhất trong ES 2.0, do đó hầu hết những gì được nói và viết cho truy vấn so với bộ lọc sẽ không được áp dụng nữa. Ngoài ra kiểm tra bài viết trên blog chính thức thông báo thay đổi này.
Val

Câu trả lời:


201

Sự khác biệt rất đơn giản: các bộ lọc được lưu trữ và không ảnh hưởng đến điểm số, do đó nhanh hơn các truy vấn. Có một cái nhìn ở đây quá. Giả sử một truy vấn thường là thứ mà người dùng nhập và khá khó đoán, trong khi các bộ lọc giúp người dùng thu hẹp kết quả tìm kiếm, ví dụ như sử dụng các khía cạnh.


19
Đúng vậy, nếu người dùng đang thực hiện tìm kiếm google thì tôi sẽ sử dụng truy vấn? Nếu họ đang chọn giá trị có thể từ một danh sách thả xuống (ví dụ: số hóa đơn> 50) thì đây có phải là bộ lọc không?
Jonesie

4
Đúng, điều đó hoàn toàn chính xác. Bất cứ lúc nào bạn cần hạn chế toàn bộ bộ tài liệu theo một số liệu, đó thường là trường hợp bộ lọc phù hợp. Vì vậy, có thể theo độ tuổi, chiều dài, kích thước, v.v.
Zach

Giải pháp của tôi sử dụng các bộ lọc và truy vấn trong cùng một yêu cầu và nó cực nhanh trên cơ sở dữ liệu thử nghiệm. Chúng tôi sẽ sớm nhận được dữ liệu trực tiếp trong đó để xem nó thực sự nhanh như thế nào.
Jonesie

@Zach Để hoàn toàn rõ ràng, trong một hệ thống nhiều bên thuê - với các quyền cho người dùng trong một bên thuê -, có vẻ như thông tin về người thuê / xác thực sẽ là một bộ lọc được thêm vào mọi truy vấn (ví dụ: Truy vấn được lọc). Đúng?
Scott Willeke

4
@activescott Yep, đó là những gì tôi sẽ làm. Bạn cũng có thể thiết lập các bí danh được lọc để "bí danh người dùng" luôn áp dụng bộ lọc phù hợp. Làm cho việc quản trị trở nên dễ dàng hơn và không yêu cầu thay đổi mã để cập nhật các truy vấn, thêm hành trình trong truy vấn của bạn, v.v.
Zach

99

Đây là những gì tài liệu chính thức nói:

Theo nguyên tắc chung, các bộ lọc nên được sử dụng thay vì truy vấn:

  • cho nhị phân có / không tìm kiếm
  • cho các truy vấn về các giá trị chính xác

Theo nguyên tắc chung, các truy vấn nên được sử dụng thay vì các bộ lọc:

  • để tìm kiếm toàn văn
  • kết quả phụ thuộc vào điểm số liên quan

Khi tôi muốn xóa tài liệu, tôi có nên sử dụng bộ lọc nếu có thể? Tôi không muốn nó được lưu trữ
Rytek

khi xóa một tài liệu, bạn không yêu cầu bất kỳ điểm số nào, bạn cũng không cần phải thực hiện tìm kiếm toàn văn. Vì vậy, đây sẽ là một bộ lọc hơn, vì bạn chỉ cần đưa ra quyết định xóa / không xóa. bộ lọc-truy vấn-bối cảnh
nonNumericalFloat

13

Một ví dụ (hãy tự thử)

Chỉ mục Say myindexchứa ba tài liệu:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

Truy vấn: Tài liệu phù hợp với truy vấn như thế nào

Truy vấn hello sam(sử dụng từ khóa must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

Tài liệu "Hello world! I am Sam."được chỉ định điểm cao hơn "Hello world!", bởi vì trước đây khớp cả hai từ trong truy vấn. Tài liệu được tính điểm.

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

Bộ lọc: Liệu một tài liệu phù hợp với truy vấn

Bộ lọc hello sam(sử dụng từ khóa filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

Tài liệu có chứa hellohoặc samđược trả lại. Tài liệu KHÔNG được tính điểm .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

Trừ khi bạn cần tìm kiếm toàn bộ văn bản hoặc chấm điểm, các bộ lọc được ưu tiên vì các bộ lọc được sử dụng thường xuyên sẽ được lưu trữ tự động bởi Elaticsearch, để tăng tốc hiệu suất. Xem Elaticsearch: Truy vấn và lọc bối cảnh.


11

Thêm nhiều bổ sung cho cùng. Một bộ lọc được áp dụng đầu tiên và sau đó truy vấn được xử lý qua kết quả của nó. Để lưu trữ kết quả khớp đúng / sai nhị phân trên mỗi tài liệu, một cái gì đó được gọi là bit bit Array được sử dụng. Mảng BitSet này nằm trong bộ nhớ và điều này sẽ được sử dụng từ lần thứ hai bộ lọc được truy vấn. Bằng cách này, bằng cách sử dụng cấu trúc dữ liệu mảng bitet, chúng tôi có thể sử dụng kết quả được lưu trữ.

Thêm một điểm cần lưu ý ở đây, bộ đệm bộ lọc chỉ được tạo khi yêu cầu được thực thi do đó chỉ từ lần truy cập thứ hai, chúng tôi thực sự có được lợi thế của bộ đệm.

Nhưng sau đó, bạn có thể sử dụng API ấm hơn , để vượt xa điều này. Khi bạn đăng ký truy vấn với bộ lọc dựa trên API ấm hơn, nó sẽ đảm bảo rằng điều này được thực thi đối với một phân đoạn mới bất cứ khi nào nó xuất hiện. Do đó chúng ta sẽ có được tốc độ phù hợp từ lần thực hiện đầu tiên.


1
Hấp dẫn! Tôi đã không nhận ra các bộ lọc xảy ra trước khi truy vấn. Bộ nhớ đệm của bộ lọc có ý nghĩa hơn bây giờ.
tục khai thác

Không phải lúc nào. Sự khác biệt cơ bản và chính giữa truy vấn điểm được lọc và không đổi. Điểm số không đổi luôn thực hiện truy vấn đầu tiên và sau đó áp dụng bộ lọc trên nó. Ngay cả truy vấn được lọc cũng có cài đặt theo đó truy vấn có thể thực thi trước các bộ lọc.
piyushGidel

10

Về cơ bản, một truy vấn được sử dụng khi bạn muốn thực hiện tìm kiếm trên các tài liệu của mình bằng tính điểm. Và các bộ lọc được sử dụng để thu hẹp tập hợp kết quả thu được bằng cách sử dụng truy vấn. Bộ lọc là boolean.

Ví dụ: bạn có một chỉ mục các nhà hàng giống như zomato. Bây giờ bạn muốn tìm kiếm các nhà hàng phục vụ 'pizza' , về cơ bản là từ khóa tìm kiếm của bạn.

Vì vậy, bạn sẽ sử dụng truy vấn để tìm tất cả các tài liệu có chứa "pizza" và một số kết quả sẽ thu được.

Nói bây giờ bạn muốn danh sách các nhà hàng phục vụ pizza và có xếp hạng ít nhất 4.0.

Vì vậy, những gì bạn sẽ phải làm là sử dụng từ khóa "pizza" trong truy vấn của bạn và áp dụng bộ lọc để xếp hạng là 4.0.

Điều gì xảy ra là các bộ lọc thường được áp dụng trên các kết quả thu được bằng cách truy vấn chỉ mục của bạn.


Bạn có thể cung cấp một ví dụ về một cơ thể yêu cầu?
Chó

9

Filters-> Tài liệu này có khớp không? một câu trả lời có hoặc không

Queries-> Tài liệu này có khớp không? Làm thế nào nó cũng phù hợp? sử dụng tính điểm


0

Kể từ phiên bản 2 của Elaticsearch, các bộ lọc và truy vấn đã được hợp nhất và bất kỳ mệnh đề truy vấn nào cũng có thể được sử dụng làm bộ lọc hoặc truy vấn (tùy thuộc vào ngữ cảnh). Cũng như phiên bản 1, các bộ lọc được lưu trữ và nên được sử dụng nếu việc ghi điểm không thành vấn đề.

Nguồn: https://logz.io/blog/elaticsearch-queries/

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.