Elasticsearch ภาคลุยสนาม ตอนที่ 1

Tanakorn Numrubporn
Machine Reading
Published in
5 min readApr 28, 2018

สร้าง Search Engine ด้วยตัวเอง

Elasticsearch คือเครื่องมือที่ใช้สร้าง search engine ของเราขึ้นมาเอง มีความสามารถตั้งแต่การค้นหาสินค้า, วิเคราะห์ข้อมูลใน Social Media, ทำ Log ของระบบ และสร้างระบบข้อมูล

Elasticsearch เป็นระบบที่ติดตั้งง่าย และใช้งานง่ายได้อย่างไม่น่าเชื่อ แต่ก็มีความซับซ้อน และความสามารถมากพอที่จะช่วยให้เราสร้างระบบ Search Engine ดีๆ แบบ Google ด้วยตัวเองได้

เนื้อหาของบทความนี้ รวบรวม และสรุปมาจากข้อมูลมาจากสองแหล่ง นั่นคือ คอร์ส Complete Guide to Elasticsearch และ หนังสือ Elasticsearch in Action

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

บทความนี้ประกอบไปด้วยหลายตอน ดังนั้น หากผู้อ่านสนใจก็สามารถติดตามไปได้เรื่อยๆ นะครับ

ผมคงไม่ต้องเสียเวลาอธิบายแล้วมั๊งครับว่า Search Engine อย่าง Google หรือ Bing มีความสำคัญกับชีวิตเราขนาดไหน ชีวิตตั้งแต่ตื่นยันหลับในแต่ละวัน ยากมากที่จะไม่มีวันไหนที่เราไม่ได้ใช้งาน ตั้งแต่ หาที่เที่ยว, กลางวันนี้จะกินอะไรดี, วิธีจับพิรุธว่าผัวจะมีเมียน้อย ฯลฯ

คุณอยากจะให้เว็บไซต์ของคุณมีระบบค้นหาที่มีคุณภาพหรือเปล่า? หากคุณขายสินค้าออนไลน์ การช่วยให้ลูกค้าค้นหาสินค้าได้ง่ายขึ้นก็จะช่วยให้คุณเพิ่มยอดขายได้ดีขึ้น หรือหากคุณเป็นเว็บไซต์รวมบทความท่องเที่ยว หากลูกค้าค้นหาแค่จังหวัดแล้วเจอบทความที่เกี่ยวข้องอย่างง่ายๆ ก็คงดี

การันตีด้วยคุณภาพของ product ที่มีแต่ยักษ์ใหญ่ของโลกนำไปใช้ ทั้ง Netflix, Stackoverflow, LinkedIn, Medium (แพลตฟอร์มที่ใช้เขียนบทความนี้)

รายชื่อของบริษัทบางส่วนที่เลือกใช้ Elasticsearch

Elasticsearch ทำงานยังไง

Search Engine ทุกตัวจะมีองค์ประกอบสามส่วนใหญ่ๆ ที่เหมือนกัน นั่นคือ การทำระบบ ดัชนีค้นหา (Index), ระบบคะแนนผลลัพธ์ (Relevancy) และระบบอำนวยความสะดวกผู้ใช้

หากไม่มีการทำดัชนีค้นหาขึ้นมาก่อน ผู้ใช้งานจะไม่สามารถค้นหาอะไรในเว็บของเราได้เลย ซึ่งระบบดัชนีของ Search Engine ทั้งหลายนั้นมีชื่อเรียกเฉพาะว่า Inverted Index ซึ่งมีวิธีทำงานดังนี้

เริ่มจากรูปก่อนเลยเป็นไง จะได้เข้าใจง่ายๆ

วิธีการทำงานของ Inverted Index

สมมติคุณทำระบบสำหรับค้นหาข้อมูลในหนังสือ ดังนั้น ข้อมูลดิบที่คุณจะต้องเก็บในฐานข้อมูลก็คือ เนื้อหาตัวอักษรทั้งหมดในหนังสือ แต่ข้อมูลนี้คุณไม่สามารถนำไปใช้ค้นหาได้ (หากคุณฝืนจะค้นหาคำบางคำภายใต้กองหนังสือเป็นพัน เป็นหมื่นเล่ม รับประกันได้เลยว่า คุณต้องรอเป็นชาติแน่)

ระบบจะทำการจัดเก็บระบบ Inverted Index โดยนำ แต่ละคำภายในหนังสือมาจัดเรียงใหม่โดยทำคล้ายๆ กับสารบัญเพื่อแจ้งว่าคำๆ นั้น บรรจุอยู่ในหนังสือเล่มใดบ้าง

เวลาผู้ใช้ค้นหาระบบ เช่นค้นหาคำว่า “นิยาย” ระบบ Search Engine จะเข้าไปค้นหาใน Inverted Index เพื่อดูว่า “นิยาย” อยู่ในหนังสือเล่มไหนบ้าง แล้วจึงส่งผลลัพธ์ออกไปให้กับผู้ใช้ว่า มันอยู่ใน เล่ม 1 และ 2 ตามตัวอย่างในรูป

คำถามต่อมาก็คือ แล้วหากคำๆ นั้นมันปรากฎอยู่ในหนังสือหลายเล่มล่ะ เวลา Search Engine มันแสดงผลลัพธ์ จะเอาอะไรตัดสินว่า เล่มไหนต้องขึ้นอันดับ 1 เล่มไหนต้องอยู่ที่โหล่

อันแรกเลยคือ มันจะคำนวนจากจำนวนของคำในหนังสือ หรือบทความนั้นๆ ตัวอย่างเช่น หากคุณเข้าไปในเว็บ DuckDuckGo แล้วค้นคำว่า election คุณจะได้ผลลัพธ์ดังรูป

อันดับผลลัพธ์จากการค้นหาด้วยคำว่า “election”

จะเห็นว่า บทความแรกจะมีคำว่า election อยู่ 3 ตัว ส่วนที่อยู่อันดับรองลงไปก็มีจำนวนคำที่น้อยลงไป

Elasticsearch จะใช้วิธีคำนวนคะแนนที่มีชื่อว่า TF-IDF (Term Frequency-Inverse Document Frequency) โดยแต่ละตัวจะมีความหมายดังนี้

  • Term Frequency: ยิ่งมีคำในเอกสารมากเท่าไหร่ คะแนนก็ยิ่งมากเท่านั้น
  • Inverse Document Frequency: ยิ่งคำๆ นั้น ไปปรากฎบนเอกสารจำนวนน้อยเท่าไหร่ คะแนนก็ยิ่งมาก ยกตัวอย่างเช่น “กับ แก่ แต่ ต่อ และ ก็ ซึ่ง อัน” เป็นคำเชื่อมที่ไม่มีความหมายอะไร และมักจะปรากฎอยู่ในเอกสารทุกฉบับอยู่แล้ว ดังนั้น คำพวกนี้ ระบบจะไม่ให้นำหนักเลย

นอกจากเรื่องของระบบ Inverted Index และการคำนวนคะแนนผลลัพธ์แล้ว Search Engine ที่ดีจะต้องมีเครื่องมืออำนวยความสะดวกให้ผู้ใช้ อย่างเช่น การค้นหาจากการพิมพ์ผิด (พิมพ์ว่า “จักยน” แต่ระบบก็ค้นหาคำว่า “จักรยาน” มาให้), suggestions ดังรูป

ระบบ Suggestion ของ Google

การติดตั้ง Elasticsearch Mac OSX

ก่อนจะจบเนื้อหาสำหรับวันนี้ เรามาถกแขนเสื้อกันหน่อยดีกว่า ด้วยการติดตั้ง Elasticsearch และ Kibana (เครื่องมือสำหรับการฝึกฝนสำหรับบทความนี้)

(สำหรับคนที่ยังไม่ได้ติดตั้ง Java JDK) เริ่มต้นโดยการติดตั้ง Java JDK ซึ่งหากคุณยังไม่ติดตั้งก็ให้ไป download ได้จาก http://www.oracle.com/technetwork/java/javase/downloads/index.html

เมื่อติดตั้งเสร็จแล้ว ให้ไปดาวน์โหลด Elasticsearch ที่ https://www.elastic.co/downloads/elasticsearch

จากนั้นก็ให้เลือก Zip ดังรูป

เลือกดาวน์โหลด Elasticsearch แบบ Zip format

จากนั้นให้ทำการแตก Zip File ในตำแหน่งที่คุณต้องการ แล้วเปิด Terminal แล้วเข้าไปใน folder ที่คุณเพิ่งแตกจาก Zip File ไป จากนั้นก็เปิดการทำงานของ Elasticsearch ได้โดยพิมพ์คำสั่งว่า

bin/elasticsearch

ทดสอบโดยการเข้าไปใน Browser แล้วไปที่

http://localhost:9200/

หากไม่มีอะไรผิดพลาด คุณจะเห็นข้อมูลดังรูป

จบครับ สำหรับขั้นตอนการติดตั้ง Elasticsearch (ง่ายปะ)

การติดตั้ง Kibana สำหรับ Mac OSX

ต่อไปจะเป็นการติดตั้งเครื่องมือที่จะทำให้การศึกษา Elasticsearch เป็นไปได้ง่ายขึ้น เพราะคุณสามารถทดสอบ ดูผลลัพธ์ และค้นหาข้อมูลผ่านเครื่องมือตัวนี้ได้เลย (หากคุณไม่ใช้เครื่องมือช่วย เวลาทำงานกับ Elasticsearch ต้องทำผ่าน Command Line ซึ่งเป็นอะไรที่ไม่น่าอภิรมย์เอาเสียเลย)

เครื่องมือตัวนี้ชื่อว่า Kibana เป็นหนึ่งในเครื่องมือของชุดซอฟต์แวร์ของ Elastic สามารถติดตั้งได้ดังนี้

เริ่มจากเข้าไปดาวน์โหลด Kibana ได้จาก Link https://www.elastic.co/downloads/kibana

จากนั้นก็เลือกดาวน์โหลดในเวอร์ชั่น MAC ครับ

เมื่อดาวน์โหลมาแล้ว ให้ทำการแตก File (ไฟล์จะเป็นนามสกุล .tar.gz) ซึ่งคุณสามารถ double click เพื่อแตก หรือพิมพ์คำสั่งต่อไปนี้บน terminal ก็ได้

tar -zxf kibana-6.2.4-darwin-x86_64.tar.gz

จากนั้นก็เปิด terminal ขึ้นมาอีกหน้าต่างหนึ่ง (แยกต่างหากจาก terminal ที่เปิด Elasticsearch) แล้วพิมพ์คำสั่งต่อไปนี้

bin/kibana

เปิด Browser ขึ้นมาแล้วเข้าไปที่

http://localhost:5601/

หากไม่มีอะไรผิดพลาด คุณจะเจอกับหน้าจอดังต่อไปนี้

หน้าจอเริ่มต้นของ Kibana

Setup Data & Kibana

ก่อนจากกัน ขออีกสองเรื่องครับ เพราะอยากจะให้เรื่องยุ่งๆ อย่างการติดตั้ง และการ Setup เครื่องมือเครื่องไม้ทั้งหมด มันจบไปในตอนแรกตอนเดียว และตอนนี้เราเหลืออยู่อีกสองขั้นตอนนั่นคือ การใส่ข้อมูลเข้าไปใน Elasticsearch และการ Setup ให้ Kibana ติดต่อกับ Elasticsearch ได้

การนำเข้าข้อมูล

ผมได้เตรียมข้อมูลดิบสำหรับคุณไว้ให้แล้ว สามารถไปดาวน์โหลได้ที่ https://github.com/himaeng/elasticsearchtutorial/archive/master.zip (สำหรับคนที่ใช้ Git เป็นก็สามารถ clone ได้ที่ https://github.com/himaeng/elasticsearchtutorial.git)

เมื่อได้มาแล้วให้เข้าไปที่ terminal ตัวใหม่ (แยกต่างหากจาก terminal ของ Elasticsearch กับ Kibana ที่เปิดไว้แล้วก่อนหน้านี้) จากนั้นเพื่อรับประกันว่าภายในระบบของคุณไม่มีข้อมูลนี้อยู่ ขอให้คุณทำการลบข้อมูลนี้โดยการพิมพ์คำสั่งต่อไปนี้

curl -H "content-type: application/json" -XDELETE "http://localhost:9200/product"

ไม่ต้องห่วงนะครับ ในตอนต่อๆ ไปคุณจะเข้าใจประโยคคำสั่งข้างต้นทั้งหมด แต่ตอนนี้ผมขออนุญาติข้ามไปก่อน

จากนั้นก็ให้คุณเข้าไปยัง Folder ที่คุณได้วางไฟล์ test-data.json ที่คุณเพิ่งดาวน์โหลดมา แล้วให้พิมพ์คำสั่งต่อไปนี้

curl -H "content-type: application/json" -XPOST "http://localhost:9200/product/default/_bulk?pretty" --data-binary "@test-data.json"

เช่นเดิมครับ ในตอนต่อๆ ไปคุณจะเข้าใจประโยคคำสั่งข้างต้นนี้ทั้งหมด

เท่านี้ก็ถือว่า คุณได้ติดตั้งข้อมูลลงไปใน Elasticsearch เสร็จเรียบร้แยแล้ว

และเพื่อความชัวร์ขอให้คุณลองค้นหาข้อมูล โดยพิมพ์คำสั่งดังนี้

curl "http://localhost:9200/product/default/_search?q=basil&pretty"

หากไม่มีอะไรผิดพลาด คุณจะได้รับผลลัพธ์ดังนี้

{  "took" : 5,  "timed_out" : false,  "_shards" : {  "total" : 5,  "successful" : 5,  "skipped" : 0,  "failed" : 0},"hits" : {  "total" : 6,  "max_score" : 5.6265006,  "hits" : [    {      "_index" : "product",      "_type" : "default",      "_id" : "44",      "_score" : 5.6265006,      "_source" : {        "name" : "Basil - Thai",        "price" : 151,        "in_stock" : 7,        "sold" : 467,        "tags" : [ ],        "description" : "Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris. Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.",        "is_active" : true,        "created" : "2012/04/10"      }    },    ...  ]}

Setup Kibana

คราวนี้เราจะมา Setup Kibana ให้ติดต่อกับ Elasticsearch ได้ เวลาเราค้นหา หรือ query จะได้ไม่ต้องลำบากทำบนหน้า terminal (เห็นแล้วใช่มั๊ยครับว่า การใช้ terminal เพื่อติดต่อกับ Elasticsearch ลำบากยังไง)

ให้เข้า Browser แล้วเข้าไปที่

http://localhost:5601/

(บนหน้าจอ Kibana) ให้เลือก Management จากเมนูด้านซ้าย แล้วให้เลือก “Index Patterns” ดังรูป

เลือก Management จากเมนูซ้ายมือ แล้วจากนั้นเลือก Index Patterns

ใน Step 1 of 2: Define index pattern ในช่อง Index pattern ให้กรอก * แล้วจากนั้นก็คลิกปุ่ม > Next Step ทางด้านขวามือของจอภาพ ดังรูป

กรอก * ในช่อง Index Pattern และคลิกปุ่ม > Next step

ในหน้าจอ Step 2 of 2: Configure settings ตรงช่อง Time filter field name ให้เลือก I don’t want to use the Time Filter แล้วจากนั้นก็คลิกปุ่ม Create index pattern ดังรูป

เลือก I don’t want to use the Time Filter ในช่อง Time Filter field name แล้วคลิกปุ่ม Create index pattern

เท่านี้ก็จบการ Setup

คราวนี้เราลองมาใช้งาน Kibana ในการค้นหาข้อมูลด้วย keyword คำว่า basil กันซักหน่อยดีกว่า

ที่เมนูซ้ายมือ ให้เลือก Dev Tools จากนั้นตรงช่อง Console ให้กรอกคำสั่ง ดังต่อไปนี้

GET product/default/_search?q=basil

แล้วคลิกปุ่ม สามเหลี่ยมสีเขียวที่ปรากฎข้างคำสั่งที่เราเพิ่งพิมพ์ไป

จากนั้นผลลัพธ์จะปรากฎทางขวามือของจอ ดังรูป

ผลลัพธ์จากการค้นหาด้วยคำว่า basil

หากคุณยังจำกันได้ ก่อนหน้านี้ผมก็ได้ลองค้นหาจาก Elasticsearch บน Terminal ด้วยคำสั่งดังต่อไปนี้

curl "http://localhost:9200/product/default/_search?q=basil&pretty"

ซึ่งจะได้ผลลัพธ์แบบเดียวกัน จะเห็นว่า การค้นหาใน Kibana เรียบง่ายกว่าเยอะมาก

ก็เป็นอันจบไปแล้วนะครับสำหรับตอนแรกของ บทความสรุป Elasticsearch เพื่อให้คุณสามารถสร้าง Search Engine ด้วยตัวเอง

ในตอนนี้คุณได้รู้ตั้งแต่ข้อมูลการทำงานพื้นฐานของ Elasticsearch จากนั้นผมก็สอนให้คุณทำการติดตั้งระบบ พร้อมทั้งนำเข้าข้อมูลดิบ และทดลองค้นหาภายในบทความเดียว

จะเห็นได้ว่า เราได้ทำทั้งกระบวนการในการสร้าง Search Engine แล้วนะครับ ซึ่งมันง่าย และเร็วมาก

หมายเหตุ: สำหรับผู้ใช้ Windows การติดตั้งจะไม่ค่อยต่างจากใน Mac เท่าไหร่ เพียงแต่จะมีขั้นตอนเพิ่มเติมที่คุณจะต้องติดตั้ง curl ด้วยตัวเอง โดยสามารถไปดาวน์โหลดได้ที่ https://curl.haxx.se/download.html

curl เป็นเครื่องมือที่เราใช้สำหรับการนำเข้าข้อมูล และการค้นหาใน Elasticsearch ผ่าน command line

--

--