Elasticsearch SQL Translate API

Elasticsearch Sql Translate Api



ในโพสต์นี้ เราจะเรียนรู้วิธีแปลการค้นหา SQL เป็นคำขอ API การค้นหาของ Elasticsearch ที่ถูกต้องซึ่งมีภาษาเฉพาะโดเมนการสืบค้นแบบเต็มตาม JSON

แม้ว่านี่จะเป็น API ขนาดเล็ก แต่ก็เป็นเครื่องมือที่มีประโยชน์มาก โดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาที่มาจากฐานข้อมูล SQL นอกจากนี้ยังสามารถลดเส้นโค้งการเรียนรู้โดยเชื่อมโยงการสืบค้น SQL กับคำค้นหาที่เกี่ยวข้องอย่างรวดเร็ว

จากนั้น คุณสามารถสำรวจความสามารถทั้งหมดของ Elasticsearch search API และภาษาการสืบค้นที่รองรับได้







โปรดทราบว่าแม้ว่า Elasticsearch จะรองรับ SQL แต่ก็มีข้อจำกัดหลายประการ



ไวยากรณ์แบบสอบถาม

ต่อไปนี้แสดงไวยากรณ์ของ API การแปล:



GET _sql/translate

{

request_body

}

คุณยังสามารถส่งคำขอโพสต์ไปยัง API การแปลตามที่แสดงในไวยากรณ์ต่อไปนี้:





POST _sql/แปล

{

request_body

}

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

ใน request_body คุณสามารถระบุพารามิเตอร์เนื้อหาคำขอ SQL Search API ทั้งหมดได้ สำรวจเอกสารที่ให้ไว้ในแหล่งข้อมูลต่อไปนี้เพื่อเรียนรู้เพิ่มเติม:



https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-search-api.html#sql-search-api-request-body

ในการตอบกลับ การสืบค้นควรส่งคืนผลลัพธ์ที่สอดคล้องกับ API การค้นหาพร้อมข้อมูลที่สืบค้น

ตัวอย่าง

เพื่อให้เห็นภาพวิธีใช้ API นี้ได้ดีที่สุด เราจะถือว่าเรามีดัชนีชื่อ “netflix” ที่มีข้อมูลทั้งหมดเกี่ยวกับภาพยนตร์และรายการทีวีของ Netflix

สมมติว่าเราต้องการดึงภาพยนตร์ห้าอันดับแรกจากดัชนี Netflix ที่เราออกในปี 2020 ขึ้นไป:

แบบสอบถาม SQL ที่เทียบเท่าสามารถแสดงได้ดังที่แสดงด้านล่าง:

เลือกชื่อเรื่อง ระยะเวลา คะแนน พิมพ์จาก netflix โดยที่ประเภท = 'ภาพยนตร์' และ release_year >= 2020

ในการดำเนินการค้นหา SQL ด้านบนใน Elasticsearch เราสามารถใส่ลงใน SQL Search API ดังที่แสดงด้านล่าง:

curl -XGET “http://localhost:9200/_sql?format=txt” -ชม 'kbn-xsrf: กำลังรายงาน' -ชม 'ประเภทเนื้อหา: แอปพลิเคชัน/json' -d '

{

'แบบสอบถาม': ' \n เลือกชื่อเรื่อง ระยะเวลา คะแนน พิมพ์จาก 'netflix' โดยที่ประเภท = '
\ '' ภาพยนตร์ ' \' ' และ release_year >= 2020 \n ',

'
fetch_size ': 5

}'

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

ดังที่เราเห็น Elasticsearch ส่งคืนผลลัพธ์ที่คาดไว้

ในการส่งคืนผลลัพธ์เป็น JSON เราสามารถตั้งค่ารูปแบบเป็น JSON ดังที่แสดงด้านล่าง:

curl -XGET 'http://localhost:9200/_sql?format=json' -ชม 'kbn-xsrf: กำลังรายงาน' -ชม 'ประเภทเนื้อหา: แอปพลิเคชัน/json' -d '

{

'แบบสอบถาม': ' \n เลือกชื่อเรื่อง ระยะเวลา คะแนน พิมพ์จาก 'netflix' โดยที่ประเภท = '
\ '' ภาพยนตร์ ' \' ' และ release_year >= 2020 \n ',

'
fetch_size ': 5

}'

เอาท์พุท:

แปลงการสืบค้น SQL เป็นคำขอค้นหา

ในการแปลงคำค้นหา SQL ก่อนหน้าเป็นคำขอ Elasticsearch เราสามารถส่งต่อไปยัง API การแปลดังที่แสดงด้านล่าง:

curl -XGET 'http://localhost:9200/_sql/translate' -ชม 'kbn-xsrf: กำลังรายงาน' -ชม 'ประเภทเนื้อหา: แอปพลิเคชัน/json' -d '

{

'แบบสอบถาม': ' \n เลือกชื่อเรื่อง ระยะเวลา คะแนน พิมพ์จาก 'netflix' โดยที่ประเภท = '
\ '' ภาพยนตร์ ' \' ' และ release_year >= 2020 \n ',

'
fetch_size ': 5

}'

API ควรแยกวิเคราะห์อินพุต SQL อินพุตและแปลงเป็นคำขอค้นหาที่ถูกต้อง ดังแสดงในเอาต์พุตต่อไปนี้:

{
'ขนาด' : 5 ,
'แบบสอบถาม' : {
'บูล' : {
'ต้อง' : [
{
'ภาคเรียน' : {
'พิมพ์' : {
'ค่า' : 'ภาพยนตร์'
}
}
},
{
'แนว' : {
'ปล่อย_ปี' : {
'จีที' : 2020 ,
'เพิ่ม' : 1
}
}
}
],
'เพิ่ม' : 1
}
},
'_แหล่งที่มา' : เท็จ,
'ทุ่งนา' : [
{
'สนาม' : 'ชื่อ'
},
{
'สนาม' : 'ระยะเวลา'
},
{
'สนาม' : 'เรตติ้ง'
},
{
'สนาม' : 'พิมพ์'
}
],
'เรียงลำดับ' : [
{
'_doc' : {
'คำสั่ง' : 'asc'
}
}
]
}

จากนั้น คุณสามารถใช้รูปแบบคำขอนี้เพื่อส่งไปยัง Elasticsearch search API ดังที่แสดงด้านล่าง:

curl -XPOST 'http://localhost:9200/netflix/_search' -ชม 'kbn-xsrf: กำลังรายงาน' -ชม 'ประเภทเนื้อหา: แอปพลิเคชัน/json' -d '
{
'ขนาด': 5,
'แบบสอบถาม': {
'บูล': {
'ต้อง': [
{
'ภาคเรียน': {
'พิมพ์': {
'value': 'ภาพยนตร์'
}
}
},
{
'แนว': {
'release_year': {
'จีทีอี': 2020,
'บูสต์': 1
}
}
}
],
'บูสต์': 1
}
},
'_source': เท็จ,
'ฟิลด์': [
{
'field': 'หัวเรื่อง'
},
{
'ฟิลด์': 'ระยะเวลา'
},
{
'field': 'การให้คะแนน'
},
{
'ฟิลด์': 'ประเภท'
}
],
'เรียงลำดับ': [
{
'_doc': {
'order': 'asc'
}
}
]
}'

ในทำนองเดียวกัน คำขอควรส่งคืนข้อมูลที่คล้ายกันดังที่แสดงด้านล่าง:

บทสรุป

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