Elasticsearch - อนุสัญญา API

Application Programming Interface (API) ในเว็บคือกลุ่มของการเรียกใช้ฟังก์ชันหรือคำสั่งการเขียนโปรแกรมอื่น ๆ เพื่อเข้าถึงส่วนประกอบซอฟต์แวร์ในเว็บแอปพลิเคชันนั้น ๆ ตัวอย่างเช่น Facebook API ช่วยให้นักพัฒนาสร้างแอปพลิเคชันโดยเข้าถึงข้อมูลหรือฟังก์ชันอื่น ๆ จาก Facebook อาจเป็นวันเดือนปีเกิดหรืออัปเดตสถานะ

Elasticsearch จัดเตรียม REST API ซึ่งเข้าถึงโดย JSON ผ่าน HTTP Elasticsearch ใช้อนุสัญญาบางประการซึ่งเราจะพูดถึงในตอนนี้

ดัชนีหลายตัว

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

เครื่องหมายจุลภาคคั่น

POST /index1,index2,index3/_search

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

การตอบสนอง

ออบเจ็กต์ JSON จาก index1, index2, index3 ที่มี any_string อยู่ในนั้น

_all คำหลักสำหรับดัชนีทั้งหมด

POST /_all/_search

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

การตอบสนอง

ออบเจ็กต์ JSON จากดัชนีทั้งหมดและมี any_string อยู่ในนั้น

สัญลักษณ์แทน (*, +, -)

POST /school*/_search

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

การตอบสนอง

ออบเจ็กต์ JSON จากดัชนีทั้งหมดซึ่งเริ่มต้นด้วยโรงเรียนที่มี CBSE อยู่

หรือคุณสามารถใช้รหัสต่อไปนี้ได้เช่นกัน -

POST /school*,-schools_gov /_search

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

การตอบสนอง

ออบเจ็กต์ JSON จากดัชนีทั้งหมดที่ขึ้นต้นด้วย "school" แต่ไม่ใช่จาก Schools_gov และมี CBSE อยู่

นอกจากนี้ยังมีพารามิเตอร์สตริงการสืบค้น URL -

  • ignore_unavailable- จะไม่มีข้อผิดพลาดเกิดขึ้นหรือจะไม่มีการหยุดการดำเนินการหากไม่มีดัชนีอย่างน้อยหนึ่งรายการใน URL ตัวอย่างเช่นมีดัชนีโรงเรียน แต่ไม่มีร้านหนังสือ

POST /school*,book_shops/_search

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

ร้องขอร่างกาย

{
   "error":{
      "root_cause":[{
         "type":"index_not_found_exception", "reason":"no such index",
         "resource.type":"index_or_alias", "resource.id":"book_shops",
         "index":"book_shops"
      }],
      "type":"index_not_found_exception", "reason":"no such index",
      "resource.type":"index_or_alias", "resource.id":"book_shops",
      "index":"book_shops"
   },"status":404
}

พิจารณารหัสต่อไปนี้ -

POST /school*,book_shops/_search?ignore_unavailable = true

ร้องขอร่างกาย

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

การตอบสนอง (ไม่มีข้อผิดพลาด)

ออบเจ็กต์ JSON จากดัชนีทั้งหมดซึ่งเริ่มต้นด้วยโรงเรียนที่มี CBSE อยู่

allow_no_indices

trueค่าของพารามิเตอร์นี้จะป้องกันข้อผิดพลาดหาก URL ที่มีสัญลักษณ์แทนส่งผลให้ไม่มีดัชนี ตัวอย่างเช่นไม่มีดัชนีที่ขึ้นต้นด้วย Schools_pri -

POST /schools_pri*/_search?allow_no_indices = true

ร้องขอร่างกาย

{
   "query":{
      "match_all":{}
   }
}

การตอบสนอง (ไม่มีข้อผิดพลาด)

{
   "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
   "hits":{"total":0, "max_score":0.0, "hits":[]}
}

expand_wildcards

พารามิเตอร์นี้ตัดสินว่าจำเป็นต้องขยายสัญลักษณ์แทนเป็นดัชนีเปิดหรือดัชนีปิดหรือดำเนินการทั้งสองอย่าง ค่าของพารามิเตอร์นี้สามารถเปิดและปิดหรือไม่มีและทั้งหมด

ตัวอย่างเช่นปิดโรงเรียนดัชนี -

POST /schools/_close

การตอบสนอง

{"acknowledged":true}

พิจารณารหัสต่อไปนี้ -

POST /school*/_search?expand_wildcards = closed

ร้องขอร่างกาย

{
   "query":{
      "match_all":{}
   }
}

การตอบสนอง

{
   "error":{
      "root_cause":[{
         "type":"index_closed_exception", "reason":"closed", "index":"schools"
      }],
      "type":"index_closed_exception", "reason":"closed", "index":"schools"
   }, "status":403
}

วันที่รองรับคณิตศาสตร์ในชื่อดัชนี

Elasticsearch มีฟังก์ชันในการค้นหาดัชนีตามวันที่และเวลา เราจำเป็นต้องระบุวันที่และเวลาในรูปแบบเฉพาะ ตัวอย่างเช่น accountdetail-2015.12.30 ดัชนีจะจัดเก็บรายละเอียดบัญชีธนาคารของวันที่ 30 ธันวาคม 2015 การดำเนินการทางคณิตศาสตร์สามารถดำเนินการเพื่อรับรายละเอียดของวันที่เฉพาะหรือช่วงของวันที่และเวลา

รูปแบบสำหรับชื่อดัชนีคณิตศาสตร์วันที่ -

<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search

static_name เป็นส่วนหนึ่งของนิพจน์ซึ่งยังคงเหมือนเดิมในดัชนีคณิตศาสตร์ทุกวันเช่นรายละเอียดบัญชี date_math_expr มีนิพจน์ทางคณิตศาสตร์ที่กำหนดวันที่และเวลาแบบไดนามิกเช่น now-2d date_format มีรูปแบบที่เขียนวันที่ในดัชนีเช่น YYYY.MM.dd หากวันนี้คือวันที่ 30 ธันวาคม 2015 <accountdetail- {now-2d {YYYY.MM.dd}}> จะส่งคืน accountdetail-2015.12.28

นิพจน์ แก้ไขเป็น
<accountdetail- {now-d}> accountdetail-2015.12.29
<accountdetail- {now-M}> accountdetail-2015.11.30 น
<accountdetail- {ตอนนี้ {YYYY.MM}}> accountdetail-2015.12.2018

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

ผลลัพธ์ที่สวยงาม

เราสามารถรับการตอบสนองในออบเจ็กต์ JSON ที่มีการจัดรูปแบบไว้อย่างดีโดยการต่อท้ายพารามิเตอร์การสืบค้น URL นั่นคือ pretty = true

POST /schools/_search?pretty = true

ร้องขอร่างกาย

{
   "query":{
      "match_all":{}
   }
}

การตอบสนอง

……………………..
{
   "_index" : "schools", "_type" : "school", "_id" : "1", "_score" : 1.0,
   "_source":{
      "name":"Central School", "description":"CBSE Affiliation",
      "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
      "location": [31.8955385, 76.8380405], "fees":2000,
      "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5"
   }
}
………………….

ผลลัพธ์ที่มนุษย์อ่านได้

ตัวเลือกนี้สามารถเปลี่ยนการตอบสนองทางสถิติให้อยู่ในรูปแบบที่มนุษย์อ่านได้ (ถ้ามนุษย์ = จริง) หรือรูปแบบที่คอมพิวเตอร์อ่านได้ (ถ้ามนุษย์ = เท็จ) ตัวอย่างเช่นถ้า human = true ดังนั้น distance_kilometer = 20KM และถ้า human = false แล้ว distance_meter = 20000 เมื่อต้องใช้การตอบสนองโดยโปรแกรมคอมพิวเตอร์อื่น

การกรองการตอบสนอง

เราสามารถกรองการตอบสนองให้น้อยลงโดยเพิ่มในพารามิเตอร์ field_path ตัวอย่างเช่น,

POST /schools/_search?filter_path = hits.total

ร้องขอร่างกาย

{
   "query":{
      "match_all":{}
   }
}

การตอบสนอง

{"hits":{"total":3}}