Elasticsearch: ความแตกต่างระหว่าง“ Term”“ Match Phrase” และ“ Query String”


116

ใหม่ที่นี่สำหรับ Elasticsearch และพยายามทำความเข้าใจให้ดีขึ้นเกี่ยวกับความแตกต่างระหว่างคำค้นหาเหล่านี้ เท่าที่ผมสามารถบอกได้termตรงกับระยะเดียว (จะต้องเป็นตัวพิมพ์เล็กสำหรับการแข่งขันในการทำงาน?) และทั้งสองmatch phraseและquery stringตรงกับสายของข้อความ

คำตอบ:


226

termคำค้นหาตรงกับคำเดียวตามที่เป็นอยู่: ไม่มีการวิเคราะห์ค่า ดังนั้นจึงไม่จำเป็นต้องลดระดับขึ้นอยู่กับสิ่งที่คุณจัดทำดัชนีไว้

หากคุณระบุBennettในเวลาดัชนีและไม่มีการวิเคราะห์ค่าแบบสอบถามต่อไปนี้จะไม่ส่งคืนอะไรเลย:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase แบบสอบถามจะวิเคราะห์อินพุตหากมีการกำหนดตัววิเคราะห์สำหรับฟิลด์ที่สืบค้นและค้นหาเอกสารที่ตรงกับเกณฑ์ต่อไปนี้:

  • คำศัพท์ทั้งหมดจะต้องปรากฏในฟิลด์
  • ต้องมีลำดับเดียวกันกับค่าอินพุต

ตัวอย่างเช่นหากคุณจัดทำดัชนีเอกสารต่อไปนี้ (โดยใช้standardตัววิเคราะห์สำหรับฟิลด์foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

match_phraseแบบสอบถามนี้จะส่งคืนเฉพาะเอกสารแรกและเอกสารที่สอง:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringโดยค่าเริ่มต้นการค้นหาบนฟิลด์_allซึ่งมีข้อความของช่องข้อความหลายช่องพร้อมกัน นอกจากนี้ยังมีการแยกวิเคราะห์และสนับสนุนตัวดำเนินการบางอย่าง (AND / OR ... ), สัญลักษณ์แทนและอื่น ๆ (ดูไวยากรณ์ที่เกี่ยวข้อง )

ในการmatch_phraseค้นหาข้อมูลจะถูกวิเคราะห์ตามตัววิเคราะห์ที่ตั้งค่าไว้ในฟิลด์ที่ถูกสอบถาม

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

ตัวอย่างเช่นการใช้เอกสารเดิมแบบสอบถามนี้จะส่งคืนเอกสารทั้งหมด:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

แต่แบบสอบถามนี้จะส่งคืนเอกสาร 2 ชุดเดียวกันกับmatch_phraseแบบสอบถาม:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

มีอะไรอีกมากมายที่จะพูดเกี่ยวกับตัวเลือกต่างๆสำหรับข้อความค้นหาเหล่านั้นโปรดดูเอกสารที่เกี่ยวข้อง:

หวังว่านี่จะชัดเจนเพียงพอและจะช่วยได้


คำอธิบายที่ยอดเยี่ยมยอดเยี่ยมและละเอียดถี่ถ้วน! สิ่งเดียวที่ฉันไม่ชัดเจนคือการวิเคราะห์คืออะไรกันแน่ ...
blee908

1
ยินดีต้อนรับครับ :) เครื่องวิเคราะห์ประมวลผลข้อความเพื่อให้ได้เงื่อนไขที่ถูกจัดทำดัชนี / ค้นหาในที่สุด อ่านหน้าเหล่านี้ของ ElasticSearch Definitive Guideเนื่องจากนี่เป็นแนวคิดที่สำคัญมากที่ต้องทำความเข้าใจ
ThomasC

1
ใช่มาจาก SQL มีแนวคิดใหม่ ๆ มากมายที่นี่ ความแตกต่างระหว่างคำค้นหาและตัวกรองค่าที่แน่นอนเทียบกับข้อความเต็มวัตถุค้นหา JSON และวิธีการค้นหาแบบยืดหยุ่นในการดำเนินการค้นหา มากมายที่จะเข้ามา !!! ขอบคุณสำหรับแหล่งข้อมูล!
blee908

1
@ThomasC ถ้าคุณมี {"foo": "Hello beautiful world"} ในดัชนีคำค้นหาจะส่งคืนสิ่งนี้หรือไม่
batmaci

1
@batmaci matchแบบสอบถามใช้ตัววิเคราะห์หากมีการวิเคราะห์เขตข้อมูลใช่ ตามค่าเริ่มต้นเอกสารจะส่งคืนเอกสารที่มีเงื่อนไขอย่างน้อยหนึ่งข้อ (ดูพารามิเตอร์operator) และลำดับนั้นไม่สำคัญ
ThomasC

17

ฉันคิดว่าบางคนกำลังมองหาความแตกต่างระหว่างพวกเขาอย่างแน่นอนเกี่ยวกับการค้นหาบางส่วน นี่คือการวิเคราะห์ของฉันด้วย'เครื่องวิเคราะห์มาตรฐาน'เริ่มต้น : -

สมมติว่าเรามีข้อมูล: -

{"name": "สวัสดี"}

ตอนนี้จะเป็นอย่างไรถ้าเราต้องการค้นหาบางส่วนด้วย ell ???

คำค้นหาหรือการค้นหาที่ตรงกัน

{"term":{"name": "*ell*" }

จะไม่ทำงานกลับสังเกต

{"term":{"name": "*zz* *ell*" }

จะไม่ทำงานกลับสังเกต

สรุป - คำหรือการจับคู่ไม่สามารถทำการค้นหาบางส่วนได้เลย

แบบสอบถามตัวแทน: -

{"wildcard":{"name": "*ell*" }

จะได้ผล {"name": "Hello"}

{"wildcard":{"name": "*zz* *ell*" }

จะไม่ทำงานกลับสังเกต

สรุป - สัญลักษณ์แทนสามารถทำการค้นหาบางส่วนด้วยโทเค็นเดียวเท่านั้น

Query_string: -

{"query_string": {"default_field": "name","query": "*ell*"}

จะได้ผล {"name":“ Hello”}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

จะได้ผล {"name":“ Hello”}

สรุป - query_string สามารถค้นหาด้วยสองโทเค็นที่ได้รับ

-> โทเค็นที่นี่คือ ell และ zz


wildcard is able to do partial search with one token only: อย่างแม่นยำมากขึ้น, wildcardสืบค้นโดยค่าเริ่มต้นจะทำงานเฉพาะในkeywordเขตข้อมูลซึ่งเป็นโทเค็นเดียวตามนิยาม ไม่มีส่วนเกี่ยวข้องกับเนื้อหาในฟิลด์ที่มีมากกว่าหนึ่งคำ ในคำค้นหาตัวแทนของคุณ "ozzy hello" จะตรงกัน
sox กับ Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.