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?
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?
Câu trả lời:
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.
Đâ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
Chỉ mục Say myindex
chứ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
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
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 hello
hoặ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."
}
...
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.
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.
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
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 đề.