IT General
น้องๆ เคยเจอปัญหาหาข้อมูลในเว็บยากไหม? สมัยผมทำร้านเน็ต SiamCafe เนี่ย ลูกค้าชอบบ่นว่าหาเกมส์ที่ต้องการไม่เจอ ทั้งๆ ที่มีอยู่ในเครื่อง นั่นแหละครับคือปัญหาที่ Elasticsearch เข้ามาช่วยแก้
Elasticsearch มันคือ Search Engine ที่ฉลาดมากๆ ไม่ใช่แค่หาคำตรงๆ แต่มันเข้าใจความหมายของคำด้วย ทำให้ผลลัพธ์ที่ได้แม่นยำกว่าเดิมเยอะ แถมยัง Scale ได้สบายๆ ไม่ว่าข้อมูลจะเยอะแค่ไหนก็เอาอยู่ บริษัทใหญ่ๆ เลยชอบใช้กัน อย่างเช่น Netflix, Uber หรือแม้แต่ Wikipedia เองก็ใช้ Elasticsearch ในการค้นหาข้อมูล
Index ใน Elasticsearch เหมือนกับตารางใน Database นั่นแหละครับ เอาไว้เก็บข้อมูล แต่ Index ใน Elasticsearch มันพิเศษตรงที่ออกแบบมาเพื่อการค้นหาโดยเฉพาะ สมัยก่อนถ้าจะทำระบบค้นหาข้อมูลในเว็บ ต้องเขียน query SQL เองให้วุ่นวาย แต่ Elasticsearch ทำให้ชีวิตง่ายขึ้นเยอะ
Document ก็คือข้อมูลแต่ละแถวใน Index ครับ เหมือนกับ Record ใน Database นั่นแหละ Document จะอยู่ในรูปแบบ JSON (JavaScript Object Notation) ซึ่งเป็นรูปแบบที่อ่านง่าย เข้าใจง่าย
{
"title": "The Lord of the Rings",
"author": "J.R.R. Tolkien",
"publication_year": 1954
}
Query DSL คือภาษาที่เราใช้ในการสั่งให้ Elasticsearch ค้นหาข้อมูล มันเป็น JSON เหมือนกัน แต่มีรูปแบบที่ซับซ้อนกว่าหน่อย แต่ไม่ต้องกลัวครับ มีเครื่องมือช่วยให้เราเขียน Query ได้ง่ายขึ้นเยอะ
เริ่มต้นใช้งาน Elasticsearch ไม่ยากอย่างที่คิด สมัยนี้มี Docker ช่วยทำให้การติดตั้งง่ายขึ้นเยอะ ลองทำตามขั้นตอนด้านล่างนี้ดูครับ
Docker ทำให้ชีวิตง่ายขึ้นเยอะ ไม่ต้องลงอะไรให้วุ่นวาย แค่มี Docker ก็รัน Elasticsearch ได้เลย
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.0
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.0
คำสั่งแรกคือ Pull image Elasticsearch จาก Docker Hub ส่วนคำสั่งที่สองคือรัน Elasticsearch บน Docker container โดย map port 9200 และ 9300 ไปยัง host machine
หลังจากติดตั้ง Elasticsearch แล้ว เราก็มาสร้าง Index และ Insert Document กันเลย โดยใช้ REST API
# สร้าง Index
PUT /movies
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "text" },
"publication_year": { "type": "integer" }
}
}
}
# Insert Document
POST /movies/_doc
{
"title": "The Hobbit",
"author": "J.R.R. Tolkien",
"publication_year": 1937
}
คำสั่งแรกคือสร้าง Index ชื่อว่า "movies" โดยกำหนดจำนวน Shards และ Replicas ส่วนคำสั่งที่สองคือ Insert Document เข้าไปใน Index โดยมีข้อมูลของหนังสือ "The Hobbit"
ทีนี้เรามาลองค้นหาข้อมูลกันดู สมมติว่าเราต้องการหาหนังสือที่เขียนโดย J.R.R. Tolkien
GET /movies/_search
{
"query": {
"match": {
"author": "J.R.R. Tolkien"
}
}
}
คำสั่งนี้จะค้นหา Document ที่ field "author" มีคำว่า "J.R.R. Tolkien" อยู่ ผลลัพธ์ที่ได้ก็จะแสดงข้อมูลของหนังสือที่เขียนโดย J.R.R. Tolkien ทั้งหมด
ลองเข้าไปดูบทความอื่นๆ เกี่ยวกับ IT ได้ที่ SiamCafe Blog นะครับ
Elasticsearch ไม่ได้มีอยู่ตัวเดียว ยังมี Search Engine ตัวอื่นๆ ที่น่าสนใจเหมือนกัน เช่น Apache Solr, Algolia หรือแม้แต่ Database เองก็มีฟังก์ชันค้นหาข้อมูล แต่ Elasticsearch มีข้อดีหลายอย่างที่ทำให้มันโดดเด่นกว่าใครเพื่อน
Apache Solr เป็น Search Engine ที่เก่าแก่กว่า Elasticsearch แต่ Elasticsearch ใช้งานง่ายกว่าและ Scale ได้ดีกว่า Algolia เป็น Search as a Service ที่ใช้งานง่าย แต่มีค่าใช้จ่ายสูงกว่า Elasticsearch ส่วน Database ก็สามารถค้นหาข้อมูลได้ แต่ประสิทธิภาพไม่ดีเท่า Elasticsearch
| Search Engine | ข้อดี | ข้อเสีย |
|---|---|---|
| Elasticsearch | ใช้งานง่าย, Scale ได้ดี, Open Source | Learning Curve สูง |
| Apache Solr | ฟังก์ชันหลากหลาย, Mature | Config ซับซ้อน |
| Algolia | ใช้งานง่าย, Search as a Service | ค่าใช้จ่ายสูง |
สรุปแล้ว Elasticsearch เป็น Search Engine ที่คุ้มค่าที่สุดตัวหนึ่ง ถ้าต้องการระบบค้นหาข้อมูลที่มีประสิทธิภาพและ Scale ได้ Elasticsearch คือตัวเลือกที่น่าสนใจมากๆ ลองศึกษาเพิ่มเติมได้จาก SiamCafe Blog นะครับ
เอาล่ะ มาถึงส่วนที่สำคัญที่สุดแล้ว เคล็ดลับที่ผมสั่งสมมาตลอด 20 กว่าปีในการทำ IT มาเนี่ย บอกเลยว่าสำคัญมากๆ โดยเฉพาะถ้าคิดจะเอา Elasticsearch ไปใช้จริงจัง
สมัยผมทำร้านเน็ต SiamCafe เนี่ย ข้อมูลมันไม่ได้เยอะเท่าสมัยนี้หรอก แต่ก็ต้องจัดการให้ดี Search ให้ลูกค้าเจอง่ายๆ ไม่งั้นโดนบ่นแน่นอน
เรื่อง Indexing เนี่ยสำคัญสุดๆ เหมือนเราจัดหมวดหมู่หนังสือในห้องสมุดนั่นแหละ ถ้าจัดไม่ดี หาอะไรก็ไม่เจอ
เคยเจอเคสลูกค้า Index มั่วซั่วมาก พอ Search จริงๆ ช้าเป็นเต่า ผมเลยแนะนำให้ลองคิดก่อนว่า User จะ Search หาอะไร แล้วค่อยออกแบบ Index ให้ตอบโจทย์
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "thai"
},
"content": {
"type": "text",
"analyzer": "thai"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
Code นี้คือตัวอย่างการสร้าง Index โดยกำหนด Data type และ Analyzer ให้เหมาะสม เช่น ภาษาไทยก็ต้องใช้ Analyzer ที่รองรับภาษาไทย
Query ที่เขียนไม่ดี ก็เหมือนคนพูดจาวกวน Elasticsearch ก็งงเหมือนกัน ทำให้ Search ช้าลง
ผมแนะนำให้ใช้ Boolean Query ให้เป็นประโยชน์ เลือกใช้ Filter ให้ถูกประเภท ถ้าต้องการความแม่นยำสูง ก็ใช้ Term Query แทน Match Query
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "คำที่ต้องการค้นหา" }}
],
"filter": [
{ "range": { "created_at": { "gte": "2023-01-01", "lte": "2023-12-31" }}}
]
}
}
}
จาก Code จะเห็นว่าเราใช้ must เพื่อหาคำที่ต้องการ และใช้ filter เพื่อกรองวันที่ ทำให้ได้ผลลัพธ์ที่แม่นยำและรวดเร็ว
Elasticsearch ไม่ใช่ว่า Setup ครั้งเดียวแล้วจบ ต้องคอย Monitor Performance อยู่เสมอ
ผมเคยเจอ Elasticsearch กิน CPU เกิน 100% เพราะ Memory ไม่พอ สุดท้ายต้องเพิ่ม RAM ให้เครื่องถึงจะหาย
เครื่องมือ Monitoring ที่แนะนำก็มีพวก Kibana, Grafana หรือจะใช้ Plugin ของ Elasticsearch เองก็ได้ SiamCafe Blog มีบทความสอนใช้ Kibana อยู่ ลองไปอ่านดู
อันนี้สำคัญมาก Backup ข้อมูลเป็นเรื่องที่ห้ามละเลย ไม่ว่า Database อะไรก็แล้วแต่
ลองนึกภาพว่าข้อมูล Search ทั้งหมดหายไปเพราะ Harddisk เจ๊ง ลูกค้าจะด่าขนาดไหน
Elasticsearch มีระบบ Snapshot/Restore ในตัว ใช้งานง่ายมาก อย่าลืมตั้ง Schedule Backup เป็นประจำ
Elasticsearch เหมาะกับงาน Search เป็นหลัก Search log, Search product, Search content ใน Website ได้หมด
แต่ก็สามารถเอาไปทำ Analytics ได้ด้วย เพราะ Elasticsearch มี Aggregation Function ที่ทรงพลัง
Database เน้น Transaction, CRUD (Create, Read, Update, Delete) ส่วน Elasticsearch เน้น Search และ Analytics
เปรียบเทียบง่ายๆ Database เหมือนสมุดบัญชี ส่วน Elasticsearch เหมือน Index ท้ายเล่ม
ถ้า Setup แบบ Basic ก็ไม่ยาก แต่ถ้าต้องการ Optimize Performance หรือ Scale ให้รองรับ User จำนวนมาก ก็ต้องศึกษาเพิ่มเติม
สมัยผมทำร้านเน็ต ก็ต้องเรียนรู้เองหมด ไม่มีใครสอน แต่สมัยนี้มี Course Online เยอะแยะ หาเรียนได้ง่ายกว่าเดิมเยอะ iCafeForex ก็มีสอนนะ ลองไปดู
Elasticsearch เป็น Search Engine ที่ทรงพลังและยืดหยุ่นมาก เหมาะกับ Project ที่ต้องการ Search ที่รวดเร็วและแม่นยำ
แต่ก็ต้องศึกษาและทำความเข้าใจ Concept ของมันให้ดีก่อนใช้งานจริง หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะครับ