ElasticSearch เพิ่มฟีเจอร์ JOIN แบบ SQL ได้เสียที
(elastic.co)- ใน ES 8.18 ได้เพิ่มคำสั่ง LOOKUP JOIN ของ ES|QL ทำให้สามารถทำความสัมพันธ์และเสริมข้อมูลได้
- ตั้งค่าและดูแลง่ายกว่าฟีเจอร์ ENRICH เดิม และ มีประโยชน์สำหรับการ JOIN ข้อมูล, การวิเคราะห์ความสัมพันธ์ของเหตุการณ์ด้านความปลอดภัย, การรวมข้อมูลทรัพย์สิน
- เพิ่มโหมด
lookup indexแบบใช้ชาร์ดเดียวที่ออกแบบใหม่สำหรับการ JOIN โดยเฉพาะ — รองรับการเก็บเอกสารได้สูงสุด 2 พันล้านรายการ LOOKUP JOINจัดการการ JOIN แบบ many-to-many ได้ง่าย และเหมาะกับการระบุฟิลด์แบบไดนามิกและการทำ aggregation- สามารถ สร้าง lookup index จาก CSV ได้ง่ายผ่าน Kibana หรือ API และในอนาคตมีแผนรองรับ INNER JOIN กับ subquery เพิ่มเติม
ตอนนี้ ES|QL มี JOIN จริงแล้ว: แนะนำฟีเจอร์ LOOKUP JOIN
ตอนนี้ Elasticsearch ก็ทำ JOIN แบบ SQL ได้แล้ว
- ตั้งแต่ Elasticsearch 8.18 เป็นต้นไป ES|QL รองรับ
LOOKUP JOIN - เป็นรูปแบบ LEFT OUTER JOIN โดยข้อมูลฝั่ง “ขวา” จะถูกจัดการผ่านโหมด
lookupindex แบบใหม่ - ตัวอย่าง:
- รวมชื่อสภาพแวดล้อม (dev, QA, prod) ตาม IP address
- เพิ่มข้อมูลพนักงาน, ข้อมูลทรัพย์สิน, threat intelligence ฯลฯ เข้าไปใน security event
- วิเคราะห์สภาพแวดล้อมตาม response code จาก web log เป็นต้น
ความแตกต่างจาก ENRICH เดิม
-
วิธี ENRICH
- ต้อง ตั้งค่านโยบายล่วงหน้าบนพื้นฐานของ index
- ทุกครั้งที่ข้อมูลเปลี่ยน ต้อง รันนโยบายใหม่อีกครั้ง
- หากมีหลายรายการที่ match จะคืนค่าเป็นฟิลด์หลายค่า ทำให้การประมวลผลต่อซับซ้อน
- ไม่เหมาะกับการทำ aggregation และการวิเคราะห์เชิงสถิติ
- เหมาะกับ ข้อมูลคงที่ (ข้อมูลอ้างอิงที่แทบไม่เปลี่ยนแปลง)
-
วิธี LOOKUP JOIN
- ใช้งานได้ทันทีโดยไม่ต้องมีนโยบายแยก
- สามารถแก้ไข index ได้โดยตรง ทำให้ การเปลี่ยนแปลงสะท้อนผลทันที
- เมื่อมีหลายรายการที่ match จะถูกแยกเป็นรายแถว จึงวิเคราะห์ได้ง่าย
- เหมาะกับการจัดกลุ่มและการทำ aggregation (เช่น ยอดรวมทราฟฟิกต่อผู้ใช้)
- ได้เปรียบแม้กับ ข้อมูลที่เปลี่ยนแปลงบ่อยและอัปเดตอย่างต่อเนื่อง
ตัวอย่างการใช้งาน
FROM kibana_sample_data_logs
| WHERE response.keyword != "200"
| LOOKUP JOIN envs_lkp ON clientip
| STATS COUNT(*) by response, environment
-
JOIN ข้อมูลสภาพแวดล้อมตาม IP เพื่อวิเคราะห์ว่าข้อผิดพลาด HTTP เกิดที่ไหน
-
ยังสามารถ JOIN ข้อมูลความเป็นเจ้าของของทีม เพื่อดูได้ว่าปัญหาเกิดกับเซิร์ฟเวอร์ที่ทีมใดดูแล
FROM kibana_sample_data_logs | WHERE response.keyword != "200" | LOOKUP JOIN teams_lkp ON host | STATS num = COUNT(*) by host, response.keyword, team | SORT num DESC
วิธีสร้าง lookup index
-
ผ่าน Kibana UI: Stack Management → Index Management → Create index
-
ผ่าน REST API:
PUT mylookupindex { "settings": { "index.mode": "lookup" } } -
สามารถอัปโหลด CSV ผ่าน File Upload ของ machine learning แล้วตั้งค่าโหมด
lookupตอนสร้าง index ได้
ข้อควรระวังและเคล็ดลับ
- เนื่องจาก JOIN เป็นงานประมวลผลที่หนัก หากเป็นฟิลด์ที่ใช้บ่อย ให้พิจารณา ENRICH + ingest-time denormalization แทน
lookup lookup indexใช้ชาร์ดเดียว และมี ข้อจำกัดสูงสุด 2 พันล้านเอกสาร- สามารถเรียกดูได้โดยตรงเหมือน query ปกติด้วย
FROM <lookup_index> - ป้อนข้อมูลผ่าน Logstash หรือ Elastic Agent ได้เช่นกัน (แต่ไม่ใช่ data stream)
แผนในอนาคต
- มีแผนรองรับ INNER JOIN, SUBQUERY, และการ JOIN กับ index ทั่วไป
- มีแผนเพิ่ม UI สำหรับ สร้างและแก้ไข lookup index ได้โดยตรงใน Kibana
- ตัวอย่าง: ลากแล้ววาง CSV ใน Discover → สร้าง index อัตโนมัติ
- มีแผนเพิ่ม ฟีเจอร์จัดการ Lookup แบบ GUI (มีการเผย mockup แล้ว)
สรุปและเริ่มต้นใช้งาน
- แม้
LOOKUP JOINจะยังเป็น technical preview ก่อนการออกเวอร์ชันจริง แต่ก็เป็นฟีเจอร์ที่สามารถยกระดับ ES|QL ไปอีกขั้นได้ - เริ่มใช้งานได้บน Elastic Cloud ด้วย Elasticsearch 8.18 หรือ 9.0
ยังไม่มีความคิดเห็น