IT General
น้องๆ เคยเจอปัญหาไหม เวลาค้นหาข้อมูลในเว็บ แล้วมันไม่เจอสิ่งที่ต้องการสักที? หรือเจอแต่ก็ช้ามากๆ? นั่นแหละคือปัญหาที่ Elasticsearch เข้ามาช่วยแก้
Elasticsearch (ES) มันคือ Search Engine ที่ฉลาดและรวดเร็วมากๆ สมัยผมทำร้านเน็ต (SiamCafe.net Since 1997) ถ้ามี ES คงไม่ต้องมานั่งไล่หาข้อมูลลูกค้าจาก Log File เองให้เมื่อยตุ้ม (ฮา) มันไม่ใช่แค่ Search Engine ธรรมดา แต่มันเป็น "Distributed, RESTful Search and Analytics Engine" ฟังดูยากใช่ไหม? สรุปง่ายๆ คือ มันกระจายงานได้, คุยกับใครๆ ก็รู้เรื่อง (RESTful API), แล้วก็วิเคราะห์ข้อมูลได้ด้วย
ทำไมมันถึงสำคัญ? ลองคิดดูว่า Google, Facebook, หรือแม้แต่เว็บไซต์ E-commerce ใหญ่ๆ เค้าใช้ Search Engine กันแบบไหน? เค้าต้องค้นหาข้อมูลจาก Data จำนวนมหาศาลในพริบตา ES นี่แหละคือตัวเลือกยอดนิยมของหลายๆ ที่ เพราะมัน Scale ได้, เร็ว, แล้วก็ยืดหยุ่นสุดๆ
น้องๆ ลองนึกภาพ Index เหมือนสมุดรายชื่อในห้องสมุด สมัยผมยังเด็กๆ เวลาหาหนังสือทีต้องไปเปิดสมุด Index ก่อนว่าหนังสือที่เราต้องการอยู่ตรงไหนในห้องสมุด ES ก็เหมือนกัน Index คือที่เก็บข้อมูลของเรา แต่แทนที่จะเก็บหนังสือ มันเก็บ Document (JSON document) แต่ละ Document เปรียบเหมือน "หน้า" ในสมุดรายชื่อ
Document ใน ES คือ JSON document ที่เก็บข้อมูลของเรา เช่น ข้อมูลลูกค้า, ข้อมูลสินค้า, หรือข้อมูล Log File แต่ละ Document จะมี Fields ต่างๆ ที่เรากำหนดเอง เช่น name, age, address ลองดูตัวอย่างง่ายๆ:
{
"name": "น้องบอม",
"age": 28,
"address": "SiamCafe.net HQ"
}
Query คือคำสั่งที่เราใช้ค้นหาข้อมูลใน ES สมัยผมทำร้านเน็ต เคยเจอเคสลูกค้าลืม Username/Password ต้องมานั่งไล่ grep ใน Log File หา IP Address แต่ถ้าใช้ ES เราสามารถ Query หาข้อมูลลูกค้าจากชื่อ, อายุ, หรือข้อมูลอื่นๆ ได้อย่างรวดเร็ว ES มี Query หลายแบบให้เลือกใช้ เช่น match, term, range แต่ละแบบก็เหมาะกับสถานการณ์ที่ต่างกัน
การเริ่มต้นใช้งาน ES ไม่ยากอย่างที่คิด! สมัยนี้มี Docker ทำให้การติดตั้งง่ายขึ้นเยอะ (สมัยผมต้อง compile เอง T_T) เริ่มจาก Download และ Run ES ด้วย Docker ก่อนเลย
Docker ทำให้ชีวิตง่ายขึ้นเยอะ! (สมัยผมต้องลงเองทีละ package) แค่มี Docker ก็รัน ES ได้ง่ายๆ ด้วยคำสั่งนี้:
docker run -d -p 9200:9200 -p 9300:9300 docker.elastic.co/elasticsearch/elasticsearch:8.10.2
คำสั่งนี้จะ Download และ Run ES Container บน Port 9200 (HTTP) และ 9300 (Transport Protocol) หลังจากนั้นก็ลองเข้าไปที่ http://localhost:9200 ใน Browser ดู ถ้าเห็นหน้า Welcome ของ ES ก็แปลว่าเรียบร้อย!
หลังจากติดตั้ง ES แล้ว เราก็มาลองสร้าง Index และเพิ่ม Document กัน เริ่มจากใช้ curl หรือ Postman ส่ง Request ไปที่ ES API:
curl -XPUT "localhost:9200/customers" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"address": {
"type": "text"
}
}
}
}
'
คำสั่งนี้จะสร้าง Index ชื่อ customers พร้อมทั้งกำหนด Mapping (Schema) ของ Document ว่ามี Fields อะไรบ้าง ต่อไปก็เพิ่ม Document เข้าไป:
curl -XPOST "localhost:9200/customers/_doc" -H 'Content-Type: application/json' -d'
{
"name": "น้องบอม",
"age": 28,
"address": "SiamCafe.net HQ"
}
'
เท่านี้เราก็มีข้อมูลใน ES แล้ว! ลองไปค้นหาข้อมูลดูได้เลย
การค้นหาข้อมูลใน ES ทำได้ง่ายมากๆ แค่ส่ง Query ไปที่ ES API:
curl -XGET "localhost:9200/customers/_search?q=name:น้องบอม"
คำสั่งนี้จะค้นหา Document ที่มี name เป็น "น้องบอม" ES จะ Return ผลลัพธ์เป็น JSON ที่มีข้อมูล Document ที่ตรงกับ Query ของเรา
น้องๆ สามารถลองเล่นกับ Query แบบต่างๆ ได้ เช่น match, term, range เพื่อให้ได้ผลลัพธ์ที่ต้องการ ลองเข้าไปดู SiamCafe Blog เพิ่มเติมได้นะ
ES ไม่ใช่ Search Engine ตัวเดียวในตลาด ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Solr, Algolia, หรือแม้แต่ Database บางตัวก็มี Function ค้นหาข้อมูลได้ แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
Solr เป็น Search Engine ที่เก่าแก่และแข็งแกร่ง แต่ Config ค่อนข้างซับซ้อน Algolia เป็น Search Engine as a Service ที่ใช้งานง่าย แต่ราคาค่อนข้างสูง Database บางตัวก็มี Function ค้นหาข้อมูลได้ แต่ประสิทธิภาพอาจจะไม่ดีเท่า ES
สมัยผมทำร้านเน็ต เคยใช้ Database ค้นหาข้อมูลลูกค้า ปรากฏว่าช้ามากๆ (ฮา) ถ้ามี ES คงประหยัดเวลาไปเยอะ ลองดูตารางเปรียบเทียบด้านล่างนี้:
| Feature | Elasticsearch | Solr | Algolia |
|---|---|---|---|
| Scale | Horizontal | Horizontal | Managed |
| Ease of Use | Medium | Hard | Easy |
| Price | Open Source | Open Source | Paid |
| Real-time Search | Yes | Yes | Yes |
| Analytics | Yes | Yes | Limited |
จากตารางจะเห็นว่า ES มีความยืดหยุ่นสูง, Scale ได้, และมี Function Analytics ในตัว ทำให้เป็นตัวเลือกที่น่าสนใจสำหรับหลายๆ Project
หวังว่าน้องๆ จะเข้าใจ ES มากขึ้นนะครับ ถ้ามีคำถามอะไรเพิ่มเติม ลองเข้าไปดู SiamCafe Blog หรือถามมาได้เลย!
สมัยผมทำร้านเน็ตคาเฟ่ SiamCafe สมัยนู้น Elasticsearch ยังไม่เกิดหรอกครับ แต่เรื่อง Search นี่สำคัญสุดๆ ลูกค้าต้องหาเกม หาเพลง หาข้อมูลได้ไว ไม่งั้นเซ็ง! ตอนนั้นใช้แต่พวก Search Engine พื้นฐานในเว็บ แต่พอมาเจอ Elasticsearch นี่ชีวิตเปลี่ยนเลย มันเร็วกว่าเยอะ แถมปรับแต่งได้ละเอียดกว่ามาก
จากประสบการณ์ที่เคยใช้ Elasticsearch มาหลายปี มีเคล็ดลับง่ายๆ ที่อยากแชร์ให้ฟังครับ รับรองว่าเอาไปใช้ได้จริง ช่วยให้ Search ของคุณเทพขึ้นแน่นอน
Elasticsearch มันฉลาดนะ แต่มันก็ต้องการคนสอน! การ Analyze Text คือการบอก Elasticsearch ว่าจะ "ตัดคำ" ยังไง จะ "แปลงคำ" ยังไง เช่น เปลี่ยนตัวพิมพ์ใหญ่เป็นพิมพ์เล็ก หรือ ตัดคำศัพท์ที่ไม่สำคัญออกไป (stop words) ถ้า Analyze ไม่ดี Search ก็จะเพี้ยน
ยกตัวอย่าง สมมติคุณมีข้อมูล "SiamCafe Networking" ถ้าคุณไม่ได้ Analyze คำว่า "Networking" ให้ดี เวลาคน Search คำว่า "Network" มันก็จะไม่เจอ เพราะมันมองว่าเป็นคนละคำกัน
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "standard",
"stopwords": [ "the", "a", "is" ]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
อย่า Index ทุกอย่าง! สมัยผมทำร้านเน็ต เครื่อง Server มันไม่ได้แรงเท่าสมัยนี้ การ Index ข้อมูลเยอะเกินความจำเป็น ทำให้ Search ช้า แถมกินพื้นที่ Server อีกด้วย คิดดีๆ ว่า Field ไหนที่ต้อง Search บ่อยๆ ก็ Index เฉพาะ Field นั้นก็พอ
ลองนึกภาพตาม ถ้าคุณมีข้อมูลลูกค้าเป็นล้านคน แต่คุณใช้ Search แค่ชื่อกับเบอร์โทรศัพท์ ก็ไม่ต้องไป Index ข้อมูลอื่นๆ เช่น ที่อยู่ หรือ ประวัติการซื้อของ ให้เปลืองทรัพยากร
Search Query กับ Filter Context มันต่างกันนะ! Search Query คือการหาข้อมูลที่ "เกี่ยวข้อง" ส่วน Filter Context คือการหาข้อมูลที่ "ตรงตามเงื่อนไข" ถ้าคุณต้องการหาข้อมูลที่ตรงตามเงื่อนไขเป๊ะๆ เช่น "สินค้าที่ราคาต่ำกว่า 100 บาท" ให้ใช้ Filter Context จะเร็วกว่า
GET /my_index/_search
{
"query": {
"bool": {
"must": {
"match": {
"product_name": "keyboard"
}
},
"filter": {
"range": {
"price": {
"lte": 100
}
}
}
}
}
}
Elasticsearch เหมาะกับงานที่ต้องการ Search ข้อมูลจำนวนมากๆ ได้อย่างรวดเร็ว เช่น Search Log Files, Search Product Catalog, Search Articles หรือ Search ข้อมูลอื่นๆ ที่มีการเปลี่ยนแปลงบ่อยๆ iCafeForex เองก็ใช้ Search Engine นะครับ
ถ้าเทียบกับ Search Engine ตัวอื่นๆ Elasticsearch ถือว่าง่ายกว่าเยอะครับ แต่ก็ต้องใช้เวลาเรียนรู้บ้าง โดยเฉพาะเรื่อง Analyzer และ Query DSL แต่ถ้าเข้าใจหลักการแล้ว จะรู้สึกว่ามัน Flexible มาก
Elasticsearch มีทั้ง Open Source Version (ฟรี) และ Commercial Version (เสียเงิน) Open Source Version ก็ใช้งานได้ดีในระดับหนึ่ง แต่ถ้าต้องการ Features ขั้นสูง หรือ Support จากทีมงาน ก็ต้องใช้ Commercial Version
Elasticsearch เป็น Search Engine ที่ทรงพลัง และยืดหยุ่นมากๆ เหมาะสำหรับงานที่ต้องการ Search ข้อมูลจำนวนมากๆ ได้อย่างรวดเร็ว ถึงแม้จะต้องใช้เวลาเรียนรู้บ้าง แต่รับรองว่าคุ้มค่าแน่นอน ลองเอาเคล็ดลับที่ผมแชร์ไปปรับใช้ดูนะครับ แล้วคุณจะค้นพบว่า Elasticsearch มันเจ๋งจริงๆ ติดตามบทความอื่นๆ ได้ที่ SiamCafe Blog นะครับ