ฉันไม่เห็นคำอธิบายใด ๆ เมื่อฉันควรใช้แบบสอบถามหรือตัวกรองหรือชุดค่าผสมบางอย่างของทั้งสอง ความแตกต่างระหว่างพวกเขาคืออะไร? ใครช่วยอธิบายหน่อยได้ไหม
ฉันไม่เห็นคำอธิบายใด ๆ เมื่อฉันควรใช้แบบสอบถามหรือตัวกรองหรือชุดค่าผสมบางอย่างของทั้งสอง ความแตกต่างระหว่างพวกเขาคืออะไร? ใครช่วยอธิบายหน่อยได้ไหม
คำตอบ:
ความแตกต่างนั้นง่าย: ตัวกรองถูกแคชและไม่มีผลต่อคะแนนดังนั้นเร็วกว่าการสืบค้น ดูที่นี่ด้วย สมมติว่าคำค้นหามักเป็นสิ่งที่ผู้ใช้พิมพ์และคาดเดาไม่ได้ในขณะที่ตัวกรองช่วยให้ผู้ใช้ลดผลการค้นหาเช่นการใช้ facets
นี่คือสิ่งที่เอกสารอย่างเป็นทางการพูดว่า:
ตามกฎทั่วไปควรใช้ตัวกรองแทนการสืบค้น:
- สำหรับการค้นหาไบนารีใช่ / ไม่ใช่
- สำหรับการค้นหาด้วยค่าที่แน่นอน
ตามกฎทั่วไปแล้วควรใช้คำค้นหาแทนตัวกรอง:
- สำหรับการค้นหาข้อความแบบเต็ม
- เมื่อผลลัพธ์ขึ้นอยู่กับคะแนนความเกี่ยวข้อง
ดัชนีพูดmyindex
มีสามเอกสาร:
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!" }'
คำค้นหา: เอกสารตรงกับแบบสอบถามอย่างไรดี
hello sam
(ใช้คำหลักmust
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
เอกสาร"Hello world! I am Sam."
ถูกกำหนดให้คะแนนสูงกว่า"Hello world!"
เนื่องจากคำก่อนหน้าตรงกับคำทั้งสองในแบบสอบถาม เอกสารถูกทำแต้ม
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
ตัวกรอง: ระบุว่าเอกสารตรงกับแบบสอบถามหรือไม่
hello sam
(ใช้คำหลักfilter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
เอกสารที่มีhello
หรือsam
ส่งคืน เอกสารจะไม่ได้คะแนน
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
นอกจากนี้น้อยมากที่เหมือนกัน ตัวกรองจะถูกนำไปใช้ก่อนแล้วจึงทำการประมวลผลแบบสอบถามเหนือผลลัพธ์ ในการจัดเก็บการจับคู่ไบนารีจริง / เท็จต่อเอกสารจะใช้สิ่งที่เรียกว่า bitSet Array อาร์เรย์ BitSet นี้อยู่ในหน่วยความจำและจะใช้ตั้งแต่ครั้งที่สองที่มีการสอบถามตัวกรอง วิธีนี้ใช้โครงสร้างข้อมูลชุดบิตเราสามารถใช้ผลแคช
อีกจุดหนึ่งที่ควรทราบที่นี่แคชตัวกรองจะถูกสร้างขึ้นเฉพาะเมื่อมีการดำเนินการตามคำขอเท่านั้นจากการเข้าชมครั้งที่สองเราได้รับประโยชน์จากการแคชจริง
แต่จากนั้นคุณสามารถใช้warmer APIเพื่อให้ได้ผลเร็วกว่านี้ เมื่อคุณลงทะเบียนแบบสอบถามด้วยตัวกรองกับ API ที่อุ่นกว่ามันจะทำให้แน่ใจว่าจะดำเนินการกับกลุ่มใหม่ทุกครั้งที่มีการเผยแพร่ ดังนั้นเราจะได้ความเร็วที่สม่ำเสมอจากการประมวลผลครั้งแรก
โดยทั่วไปแล้วจะมีการใช้แบบสอบถามเมื่อคุณต้องการค้นหาเอกสารด้วยคะแนน และตัวกรองจะใช้เพื่อ จำกัด ชุดผลลัพธ์ที่ได้โดยใช้แบบสอบถาม ตัวกรองเป็นบูลีน
ตัวอย่างเช่นสมมติว่าคุณมีดัชนีร้านอาหารบางอย่างเช่น zomato ตอนนี้คุณต้องการค้นหาร้านอาหารที่ให้บริการ'พิซซ่า'ซึ่งเป็นคำหลักในการค้นหาของคุณ
ดังนั้นคุณจะใช้แบบสอบถามเพื่อค้นหาเอกสารทั้งหมดที่มี"พิซซ่า"และผลลัพธ์บางอย่างจะได้รับ
บอกว่าตอนนี้คุณต้องการรายชื่อร้านอาหารที่ให้บริการพิซซ่าและมีการให้คะแนน atleast 4.0
ดังนั้นสิ่งที่คุณต้องทำคือใช้คำหลัก"พิซซ่า"ในการค้นหาของคุณและใช้ตัวกรองเพื่อให้คะแนนเป็น 4.0
สิ่งที่เกิดขึ้นคือตัวกรองจะใช้กับผลลัพธ์ที่ได้จากการสอบถามดัชนีของคุณ
Filters
-> เอกสารนี้ตรงกันหรือไม่ ไบนารีใช่หรือไม่ใช่คำตอบ
Queries
-> เอกสารนี้ตรงกันหรือไม่ มันเข้ากันได้ดีแค่ไหน? ใช้การให้คะแนน
ตั้งแต่รุ่นที่ 2 ของ Elasticsearch ตัวกรองและคิวรีได้รับการผสานและส่วนคำสั่งใด ๆ สามารถใช้เป็นตัวกรองหรือแบบสอบถาม (ขึ้นอยู่กับบริบท) เช่นเดียวกับเวอร์ชัน 1 ตัวกรองจะถูกแคชและควรใช้หากการให้คะแนนไม่สำคัญ