Elasticsearch - แบบสอบถาม DSL

ใน Elasticsearch การค้นหาจะดำเนินการโดยใช้แบบสอบถามตาม JSON แบบสอบถามประกอบด้วยสองประโยค -

  • Leaf Query Clauses - อนุประโยคเหล่านี้คือการจับคู่คำหรือช่วงซึ่งมองหาค่าเฉพาะในฟิลด์เฉพาะ

  • Compound Query Clauses - คำค้นหาเหล่านี้เป็นการรวมกันของประโยคการค้นหาใบไม้และการค้นหาแบบผสมอื่น ๆ เพื่อดึงข้อมูลที่ต้องการ

Elasticsearch รองรับการสืบค้นจำนวนมาก แบบสอบถามเริ่มต้นด้วยคีย์เวิร์ดเคียวรีจากนั้นมีเงื่อนไขและตัวกรองอยู่ภายในในรูปแบบของออบเจ็กต์ JSON คำค้นหาประเภทต่างๆได้อธิบายไว้ด้านล่าง

ตรงกับคำค้นหาทั้งหมด

นี่คือแบบสอบถามพื้นฐานที่สุด จะส่งคืนเนื้อหาทั้งหมดและมีคะแนน 1.0 สำหรับทุกออบเจ็กต์

POST /schools/_search
{
   "query":{
      "match_all":{}
   }
}

ในการรันโค้ดด้านบนเราจะได้ผลลัพธ์ดังต่อไปนี้ -

{
   "took" : 7,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         },
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

ข้อความค้นหาแบบเต็ม

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

จับคู่ข้อความค้นหา

ข้อความค้นหานี้จับคู่ข้อความหรือวลีกับค่าของฟิลด์อย่างน้อยหนึ่งฟิลด์

POST /schools*/_search
{
   "query":{
      "match" : {
         "rating":"4.5"
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 44,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.47000363,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 0.47000363,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

ข้อความค้นหาการจับคู่หลายรายการ

ข้อความค้นหานี้ตรงกับข้อความหรือวลีที่มีมากกว่าหนึ่งฟิลด์

POST /schools*/_search
{
   "query":{
      "multi_match" : {
         "query": "paprola",
         "fields": [ "city", "state" ]
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 12,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.9808292,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 0.9808292,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         }
      ]
   }
}

Query String Query

คำค้นหานี้ใช้ตัวแยกวิเคราะห์คำค้นหาและคำหลัก query_string

POST /schools*/_search
{
   "query":{
      "query_string":{
         "query":"beautiful"
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 60,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
      "value" : 1,
      "relation" : "eq"
   },
………………………………….

แบบสอบถามระดับคำ

คำค้นหาเหล่านี้ส่วนใหญ่เกี่ยวข้องกับข้อมูลที่มีโครงสร้างเช่นตัวเลขวันที่และ enums

POST /schools*/_search
{
   "query":{
      "term":{"zip":"176115"}
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

……………………………..
hits" : [
   {
      "_index" : "schools",
      "_type" : "school",
      "_id" : "5",
      "_score" : 0.9808292,
      "_source" : {
         "name" : "Central School",
         "description" : "CBSE Affiliation",
         "street" : "Nagan",
         "city" : "paprola",
         "state" : "HP",
         "zip" : "176115",
         "location" : [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

แบบสอบถามช่วง

แบบสอบถามนี้ใช้เพื่อค้นหาวัตถุที่มีค่าระหว่างช่วงของค่าที่กำหนด สำหรับสิ่งนี้เราจำเป็นต้องใช้ตัวดำเนินการเช่น -

  • gte - มากกว่าเท่ากับ
  • gt - มากกว่า
  • lte - น้อยกว่าเท่ากับ
  • lt - น้อยกว่า

ตัวอย่างเช่นสังเกตรหัสที่ระบุด้านล่าง -

POST /schools*/_search
{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 24,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

มีแบบสอบถามระดับคำศัพท์ประเภทอื่น ๆ เช่น -

  • Exists query - หากฟิลด์ใดฟิลด์หนึ่งมีค่าที่ไม่ใช่ค่าว่าง

  • Missing query - สิ่งนี้ตรงข้ามกับคำค้นหาที่มีอยู่โดยสิ้นเชิงการค้นหานี้ค้นหาวัตถุโดยไม่มีช่องหรือเขตข้อมูลใดที่มีค่า null

  • Wildcard or regexp query - แบบสอบถามนี้ใช้นิพจน์ทั่วไปเพื่อค้นหารูปแบบในวัตถุ

แบบสอบถามแบบผสม

คำค้นหาเหล่านี้เป็นชุดของการสืบค้นที่แตกต่างกันซึ่งรวมเข้าด้วยกันโดยใช้ตัวดำเนินการบูลีนเช่นและหรือไม่ใช่หรือสำหรับดัชนีที่แตกต่างกันหรือมีการเรียกใช้ฟังก์ชันเป็นต้น

POST /schools/_search
{
   "query": {
      "bool" : {
         "must" : {
            "term" : { "state" : "UP" }
         },
         "filter": {
            "term" : { "fees" : "2200" }
         },
         "minimum_should_match" : 1,
         "boost" : 1.0
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 6,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 0,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   }
}

แบบสอบถามภูมิศาสตร์

คำค้นหาเหล่านี้จัดการกับตำแหน่งทางภูมิศาสตร์และจุดทางภูมิศาสตร์ คำค้นหาเหล่านี้ช่วยในการค้นหาโรงเรียนหรือวัตถุทางภูมิศาสตร์อื่น ๆ ที่อยู่ใกล้กับสถานที่ใด ๆ คุณต้องใช้ชนิดข้อมูลจุดภูมิศาสตร์

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{  "acknowledged" : true,
   "shards_acknowledged" : true,
   "index" : "geo_example"
}

ตอนนี้เราโพสต์ข้อมูลในดัชนีที่สร้างไว้ด้านบน

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

ในการรันโค้ดด้านบนเราจะได้รับคำตอบตามที่แสดงด้านล่าง -

{
   "took" : 1,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         "_index" : "geo_example",
         "_type" : "_doc",
         "_id" : "hASWZ2oBbkdGzVfiXHKD",
         "_score" : 1.0,
         "_source" : {
            "name" : "Chapter One, London, UK",
            "location" : {
               "type" : "point",
               "coordinates" : [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }