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
]
}
}
}
}