ความแตกต่างของ Elasticsearch ระหว่าง MUST และ SHOULD Bool


169

อะไรคือความแตกต่างระหว่างMUSTและSHOULDสอบถามบูลใน ES?

ถ้าฉันเพียงต้องการผลลัพธ์ที่มีคำของฉันฉันควรแล้วใช้must?

ฉันมีแบบสอบถามที่ควรมีค่าบางอย่างเท่านั้นและไม่มีผลลัพธ์ที่มีวันที่ / เวลาประทับที่ต่ำกว่าเวลา / วันนี้ - ทันที

ด้วย

ฉันสามารถใช้ตัวกรองหลายตัวภายใน a ต้องชอบร้องรหัส:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

คำตอบ:


251

ต้องหมายถึง: ข้อ (แบบสอบถาม) จะต้องปรากฏในเอกสารที่ตรงกัน คำสั่งเหล่านี้จะต้องตรงกับเช่นตรรกะและ

ควรหมายถึง: อย่างน้อยหนึ่งในข้อเหล่านี้จะต้องตรงกับเช่นตรรกะหรือ

โดยพื้นฐานแล้วจะถูกใช้เช่นตัวดำเนินการเชิงตรรกะ AND และ OR ดูนี่สิ

ขณะนี้อยู่ในแบบสอบถามบูล :

ต้องหมายถึง: ข้อที่ต้องตรงกันสำหรับเอกสารที่จะรวม

ควรหมายถึง: ถ้าข้อเหล่านี้ตรงกันพวกเขาจะเพิ่ม_score; มิฉะนั้นจะไม่มีผลกระทบ ใช้เพื่อปรับแต่งคะแนนความเกี่ยวข้องสำหรับแต่ละเอกสาร


mustใช่คุณสามารถใช้ตัวกรองหลายภายใน


ช้าไปงานปาร์ตี้ แต่วิธีการเกี่ยวกับmustหมวดหมู่หรือการกำหนดราคาและshouldสำหรับคุณสมบัติเช่นขนาดและสี ทีนี้ถ้าเลือกขนาด L และ XL มันควรจะอยู่ระหว่างสองตัวนี้ แต่ถ้าเลือกสีเขียวด้วยก็ต้องมีสำหรับ (ขนาด L หรือ XL) และ (สีเขียว) เป็นไปได้ไหม
Mave

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

6
ฉันคิดว่าคุณต้องมีminimum_number_should_match = 1เพื่อบังคับใช้ความคิดที่ว่า "อย่างน้อยหนึ่งข้อต้องตรงกัน"
Jim K.

คำตอบที่ดี! ฉันแค่ต้องการแบ่งปันบางส่วนของเอกสารที่มีประโยชน์มากสำหรับฉันที่จะเข้าใจสิ่งนี้ elastic.co/guide/en/elasticsearch/guide/current/...
ba0708

1
JimK - หรือไม่ต้องมีประโยคใด ๆ เมื่อไม่มีข้อที่ต้องมีค่าน้อยที่สุด _number_should_match จะส่อให้เห็น
LizH

15

เนื่องจากนี่เป็นคำถามที่ได้รับความนิยมฉันอยากจะเพิ่มสิ่งนั้นใน Elasticsearch เวอร์ชั่น 2 สิ่งต่าง ๆ เปลี่ยนไปเล็กน้อย

แทนที่จะใช้filteredคิวรีคุณควรใช้boolคิวรีในระดับบนสุด

หากคุณไม่สนใจคะแนนของmustชิ้นส่วนจากนั้นใส่ชิ้นส่วนเหล่านั้นเป็นfilterกุญแจ ไม่มีคะแนนหมายถึงการค้นหาที่เร็วขึ้น นอกจากนี้ Elasticsearch จะคิดออกโดยอัตโนมัติไม่ว่าจะแคชพวกเขา ฯลฯmust_notมีผลบังคับใช้อย่างเท่าเทียมกันสำหรับการแคช

การอ้างอิง: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

นอกจากนี้จิตใจที่"gte": "now"ไม่สามารถแคชได้เนื่องจากมีหน่วยเป็นมิลลิวินาที ใช้สองช่วงในส่วนmustคำสั่ง: ช่วงที่หนึ่งnow/1hและอีกช่วงหนึ่งnowเพื่อให้สามารถแคชครั้งแรกชั่วครู่หนึ่งและช่วงที่สองสำหรับการกรองที่แม่นยำเร่งความเร็วบนชุดผลลัพธ์ที่เล็กลง


8

ตามที่ระบุไว้ในเอกสาร :

ต้อง: ข้อ (แบบสอบถาม) จะต้องปรากฏในเอกสารที่ตรงกัน

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

ในคำอื่น ๆ ผลที่ได้จะต้องได้รับการจับคู่โดยทุกคำสั่งในปัจจุบันต้องเป็นไปตามข้อ (หรือตรงกับอย่างน้อยหนึ่งของควรข้อถ้าไม่มีต้องเป็นไปตามข้อ

ตั้งแต่คุณต้องการผลลัพธ์ของคุณเพื่อตอบสนองคำสั่งทั้งหมดที่คุณควรใช้ต้อง


แน่นอนคุณสามารถใช้ตัวกรองภายในแบบสอบถามบูลีน


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