คำค้นหากับตัวกรอง


198

ฉันไม่เห็นคำอธิบายใด ๆ เมื่อฉันควรใช้แบบสอบถามหรือตัวกรองหรือชุดค่าผสมบางอย่างของทั้งสอง ความแตกต่างระหว่างพวกเขาคืออะไร? ใครช่วยอธิบายหน่อยได้ไหม


46
เอกสารจริงไม่ชัดเจน
geekazoid

2
ดูเหมือนว่ามีปรากฏหน้ามีคำอธิบายที่สูงขึ้น: elastic.co/guide/en/elasticsearch/guide/master/...
Dmitry Polushkin

6
น่าสังเกตว่าแบบสอบถามและตัวกรองจะถูกรวมใน ES 2.0 ดังนั้นสิ่งที่กล่าวมาส่วนใหญ่และเขียนไว้สำหรับแบบสอบถามและตัวกรองจะไม่ใช้อีกต่อไป ตรวจสอบบล็อกโพสต์อย่างเป็นทางการที่ประกาศการเปลี่ยนแปลงนี้
วาล

คำตอบ:


201

ความแตกต่างนั้นง่าย: ตัวกรองถูกแคชและไม่มีผลต่อคะแนนดังนั้นเร็วกว่าการสืบค้น ดูที่นี่ด้วย สมมติว่าคำค้นหามักเป็นสิ่งที่ผู้ใช้พิมพ์และคาดเดาไม่ได้ในขณะที่ตัวกรองช่วยให้ผู้ใช้ลดผลการค้นหาเช่นการใช้ facets


19
ใช่แล้วถ้าผู้ใช้ทำการค้นหาประเภท Google ฉันจะใช้แบบสอบถามหรือไม่ หากพวกเขากำลังเลือกค่าที่เป็นไปได้จากรายการแบบหล่นลง (เช่นจำนวนใบแจ้งหนี้> 50) นี่จะเป็นตัวกรองหรือไม่
Jonesie

4
ใช่ถูกต้องแล้ว เมื่อใดก็ตามที่คุณต้องการ จำกัด ชุดเอกสารทั้งชุดโดยตัวชี้วัดบางตัวนั่นเป็นกรณีที่ตัวกรองมีความเหมาะสม ดังนั้นอาจจะตามอายุความยาวขนาด ฯลฯ เป็นต้น
Zach

โซลูชันของฉันใช้ตัวกรองและแบบสอบถามในคำขอเดียวกันและรวดเร็วในฐานข้อมูลทดสอบ ในไม่ช้าเราจะได้รับข้อมูลสดในนั้นเพื่อดูว่ามันเร็วแค่ไหน
Jonesie

@Zach เพื่อให้ชัดเจนในระบบหลายผู้เช่า - ด้วยสิทธิ์สำหรับผู้ใช้ภายในผู้เช่า - ดูเหมือนว่าข้อมูลผู้เช่า / การรับรองความถูกต้องจะเป็นตัวกรองที่เพิ่มเข้าไปในทุกแบบสอบถาม (เช่นแบบสอบถามที่ถูกกรอง) ขวา?
Scott Willeke

4
@activescott ใช่นั่นคือสิ่งที่ฉันจะทำ คุณยังสามารถตั้งค่านามแฝงที่กรองเพื่อให้ "นามแฝงผู้ใช้" ใช้ตัวกรองที่เหมาะสมเสมอ ทำให้การบริหารจัดการง่ายขึ้นและไม่จำเป็นต้องเปลี่ยนแปลงรหัสคำสั่งปรับปรุง cruft พิเศษในการค้นหาของคุณ ฯลฯ
ซัค

99

นี่คือสิ่งที่เอกสารอย่างเป็นทางการพูดว่า:

ตามกฎทั่วไปควรใช้ตัวกรองแทนการสืบค้น:

  • สำหรับการค้นหาไบนารีใช่ / ไม่ใช่
  • สำหรับการค้นหาด้วยค่าที่แน่นอน

ตามกฎทั่วไปแล้วควรใช้คำค้นหาแทนตัวกรอง:

  • สำหรับการค้นหาข้อความแบบเต็ม
  • เมื่อผลลัพธ์ขึ้นอยู่กับคะแนนความเกี่ยวข้อง

เมื่อฉันต้องการลบเอกสารฉันควรใช้ตัวกรองถ้าเป็นไปได้? ฉันไม่ต้องการให้แคช
Rytek

เมื่อลบเอกสารคุณไม่ต้องการคะแนนใด ๆ และคุณไม่จำเป็นต้องค้นหาข้อความแบบเต็ม ดังนั้นนี่จะเป็นตัวกรองมากกว่าที่คุณเพียงแค่ต้องทำการตัดสินใจลบ / ไม่ลบ filter-query-context
nonNumericalFloat

13

ตัวอย่าง (ลองด้วยตัวเอง)

ดัชนีพูด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."
     }
   ...

ยกเว้นว่าคุณต้องการค้นหาข้อความหรือให้คะแนนแบบเต็มตัวกรองเป็นที่ต้องการเนื่องจากตัวกรองที่ใช้บ่อยจะถูกแคชโดยอัตโนมัติโดย Elasticsearch เพื่อเพิ่มความเร็ว ดูElasticsearch: แบบสอบถามและบริบทการกรอง


11

นอกจากนี้น้อยมากที่เหมือนกัน ตัวกรองจะถูกนำไปใช้ก่อนแล้วจึงทำการประมวลผลแบบสอบถามเหนือผลลัพธ์ ในการจัดเก็บการจับคู่ไบนารีจริง / เท็จต่อเอกสารจะใช้สิ่งที่เรียกว่า bitSet Array อาร์เรย์ BitSet นี้อยู่ในหน่วยความจำและจะใช้ตั้งแต่ครั้งที่สองที่มีการสอบถามตัวกรอง วิธีนี้ใช้โครงสร้างข้อมูลชุดบิตเราสามารถใช้ผลแคช

อีกจุดหนึ่งที่ควรทราบที่นี่แคชตัวกรองจะถูกสร้างขึ้นเฉพาะเมื่อมีการดำเนินการตามคำขอเท่านั้นจากการเข้าชมครั้งที่สองเราได้รับประโยชน์จากการแคชจริง

แต่จากนั้นคุณสามารถใช้warmer APIเพื่อให้ได้ผลเร็วกว่านี้ เมื่อคุณลงทะเบียนแบบสอบถามด้วยตัวกรองกับ API ที่อุ่นกว่ามันจะทำให้แน่ใจว่าจะดำเนินการกับกลุ่มใหม่ทุกครั้งที่มีการเผยแพร่ ดังนั้นเราจะได้ความเร็วที่สม่ำเสมอจากการประมวลผลครั้งแรก


1
! ที่น่าสนใจ ฉันไม่ได้ตระหนักถึงตัวกรองเกิดขึ้นก่อนการสืบค้น การแคชตัวกรองทำให้เข้าใจได้ง่ายขึ้น
Constant Meiring

ไม่เสมอ. ความแตกต่างพื้นฐานและหลักระหว่างแบบสอบถามกรองและคะแนนคงที่ คะแนนคงที่จะดำเนินการแบบสอบถามก่อนเสมอจากนั้นจึงใช้ตัวกรองมากกว่า แม้แบบสอบถามที่กรองจะมีการตั้งค่าซึ่งแบบสอบถามสามารถดำเนินการก่อนที่ตัวกรอง
piyushGoyal

10

โดยทั่วไปแล้วจะมีการใช้แบบสอบถามเมื่อคุณต้องการค้นหาเอกสารด้วยคะแนน และตัวกรองจะใช้เพื่อ จำกัด ชุดผลลัพธ์ที่ได้โดยใช้แบบสอบถาม ตัวกรองเป็นบูลีน

ตัวอย่างเช่นสมมติว่าคุณมีดัชนีร้านอาหารบางอย่างเช่น zomato ตอนนี้คุณต้องการค้นหาร้านอาหารที่ให้บริการ'พิซซ่า'ซึ่งเป็นคำหลักในการค้นหาของคุณ

ดังนั้นคุณจะใช้แบบสอบถามเพื่อค้นหาเอกสารทั้งหมดที่มี"พิซซ่า"และผลลัพธ์บางอย่างจะได้รับ

บอกว่าตอนนี้คุณต้องการรายชื่อร้านอาหารที่ให้บริการพิซซ่าและมีการให้คะแนน atleast 4.0

ดังนั้นสิ่งที่คุณต้องทำคือใช้คำหลัก"พิซซ่า"ในการค้นหาของคุณและใช้ตัวกรองเพื่อให้คะแนนเป็น 4.0

สิ่งที่เกิดขึ้นคือตัวกรองจะใช้กับผลลัพธ์ที่ได้จากการสอบถามดัชนีของคุณ


คุณไม่สามารถให้ตัวอย่างคำขอเนื้อหาได้หรือไม่?
สุนัข

9

Filters-> เอกสารนี้ตรงกันหรือไม่ ไบนารีใช่หรือไม่ใช่คำตอบ

Queries-> เอกสารนี้ตรงกันหรือไม่ มันเข้ากันได้ดีแค่ไหน? ใช้การให้คะแนน


0

ตั้งแต่รุ่นที่ 2 ของ Elasticsearch ตัวกรองและคิวรีได้รับการผสานและส่วนคำสั่งใด ๆ สามารถใช้เป็นตัวกรองหรือแบบสอบถาม (ขึ้นอยู่กับบริบท) เช่นเดียวกับเวอร์ชัน 1 ตัวกรองจะถูกแคชและควรใช้หากการให้คะแนนไม่สำคัญ

ที่มา: https://logz.io/blog/elasticsearch-queries/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.