• ใน 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 โดยข้อมูลฝั่ง “ขวา” จะถูกจัดการผ่านโหมด lookup index แบบใหม่
  • ตัวอย่าง:
    • รวมชื่อสภาพแวดล้อม (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

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น