Code Mania 11: Priceza ล้วงลึกระบบค้นหา จากหลักร้อยถึงร้อยล้านของ Priceza โดยคุณวัชระ นิวาตพันธ์ CTO แห่ง Priceza.com

จากงาน Code Mania 11 เมื่อวานนะครับ ทางทีมงาน TechTalkThai ขอสรุปเนื้อหาใน Session ของ Priceza.com ที่ออกมาเปิดเผยเทคโนโลยีระบบ Search Engine ที่ถือเป็นเทคโนโลยีหลักของทาง Priceza มาให้อ่านเป็นแนวทางกันครับ

priceza_map-desktop

Priceza ล้วงลึกระบบค้นหา จากหลักร้อยถึงร้อยล้านของ Priceza โดยคุณวัชระ นิวาตพันธ์

ก่อนหน้านี้คุณวัชระทำงานที่ Exxon มา 11 ปี จนได้เวลาก็ออกมาทำ Priceza เต็มตัว ใครไม่รู้จัก Priceza ก็ลองเข้าไปที่ http://www.priceza.com/ ดูได้นะครับ (น่าจะรู้จักกันทุกคนนะ) โดยคุณวัชระได้ให้ข้อคิดเอาไว้ว่านอกจากการเขียนโปรแกรมแล้ว โปรแกรมเมอร์ก็มีหน้าที่ต้องคอยแสวงหาเทคโนโลยีใหม่ๆ มาปรับใช้กับธุรกิจด้วยเช่นกัน

ใน Session นี้เล่าถึงการสร้าง Search Engine กันตั้งแต่ต้น ตั้งแต่ระบบ Search แบบพื้นฐาน ไปจนถึงระบบ Search แบบซับซ้อนที่ปรับแต่งให้ตอบโจทย์ต่อผู้ใช้งานที่ต้องการค้นหาข้อมูลที่สนใจให้พบได้ ดังนี้ครับ

 

การเริ่มต้นสร้าง Search พื้นฐานแบบง่ายๆ

ปกติเวลาเก็บข้อมูลใดๆ เราก็มักจะเก็บกันลง Database โดยแบ่งข้อมูลออกเป็นหลายๆ Column กันตามปกติ เวลาเสิร์ชโดยปกติก็ค้นหาข้อมูลด้วยการทำ SQL Query ธรรมดา ถ้าข้อมูลไม่เยอะมากนักการทำแบบนี้ก็ทำให้ได้คำตอบผลการค้นหาอย่างรวดเร็วอยู่แล้ว

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

 

การทำให้ระบบสามารถ Search ได้อย่างรวดเร็วทำอย่างไร?

ลองคิดดูว่า Facebook ที่มีผู้ใช้งานพันล้านคน จะทำการ Login อย่างไรให้เร็วได้บ้าง? เพราะถ้าจะเทียบ Username/Password จากฐานข้อมูลของผู้ใช้งานนับพันล้านบรรทัดนั้นคงจะเป็นไปได้ยาก ดังนั้น Facebook ก็คงไม่ได้ใช้การค้นหาข้อมูลแบบทั่วๆ ไปอย่างแน่นอน และยิ่งถ้าเป็นระบบ Search Engine ที่ถึงขั้นค้นหาข้อมูลอะไรก็ได้เลยนั้น ระบบก็จะยิ่งต้องมีความซับซ้อนขึ้นไปอีก

ทางเลือกหนึ่งก็คือการปรับปรุง Hardware ให้ดีขึ้น ไม่ว่าจะเป็นการเลือกใช้ SSD หรือการเพิ่ม RAM เข้ามาทำ In-memory Database ก็ได้ ซึ่งถึงแม้วิธีการนี้จะเร็วพอแต่เมื่อมีผู้ใช้งานเข้าใช้กันเยอะๆ ก็ไม่ตอบโจทย์การใช้งานได้อย่างรวดเร็วเพียงพออยู่ดี

อีกทางเลือกหนึ่งก็คือการทำ Database Tuning ด้วยการทำ Indexing บน Database ซึ่งวิธีการนี้ก็อาจจะไม่ครอบคลุมครบการค้นหาข้อมูลได้ครบทุกแบบ เพราะ Indexing ไม่ช่วยให้ความเร็วในการทำ Full Text Search สูงขึ้นมากนัก เพราะเวลาที่ใช้ในการค้นหาข้อมูลก็ยังเยอะเท่าจำนวน Record ที่มีอยู่ดี

สิ่งที่มาช่วยตรงนี้ได้คือการทำ Inverted Index ( อ่านเพิ่มเติมได้ที่ https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html ) โดยทำการตัดข้อความในแต่ละ Document ออกมาเป็นคำๆ แล้วค่อยทำ Index สำหรับแต่ละคำตรงนั้น และเวลาผู้ใช้งานทำการค้นหา ก็ทำการตัดคำเหล่านั้นออกมาทำการ Search ทีละคำแล้วค่อยประกอบผลลัพธ์เข้าด้วยกัน ก็จะทำให้ครอบคลุมการค้นหาได้หลากหลายรูปแบบมากกว่า และเร็วกว่าเดิมอีกด้วย และยิ่งเมื่อใช้ Binary Search เข้าช่วยก็ยิ่งทำให้เร็วขึ้นไปอีก

 

Search Engine ทำงานอย่างไร?

จากข้อที่แล้วจะเห็นได้ว่า Inverted Index คือหัวใจสำคัญของระบบ Search โดย Search Engine ก็คือระบบ Datastore ที่ช่วยให้ค้นหาข้อมูลได้เร็วขึ้น โดยแทนที่จะเก็บข้อมูลเอาไว้ใน MySQL แล้ว Query เอา ก็ย้ายข้อมูลมาใส่เอาไว้ใน Seach Engine แทน โดย Search Engine มีหน้าที่หลักๆ 3 อย่าง

  1. ตัดคำ (Text Analysis)
  2. จัดเก็บ/สร้าง Index
  3. ค้นหา (Sort/Filter)

ในการตัดคำนี้จะคล้ายๆ กับการแสกนข้อมูลและทำ Parser นั่นเอง สำหรับการหาคำภาษาอังกฤษก็จะง่ายหน่อยเพราะมี Spacebar และ Full Stop คอยแบ่งคำและประโยคให้อยู่แล้ว โดยอาจจะเลือกตัดคำพวก a an the ออกไปก็ได้ แล้วจากนั้นก็เป็นขั้นตอนของการแปลงคำในรูปต่างๆ ให้กลายเป็นคำเดียวกัน เช่น การยุบคำว่า Fish กับ Fishing เข้าด้วยกันเพราะเป็นหมวดหมู่เดียวกัน รวมถึงยุบคำ Synonym ที่มีความหมายเหมือนกันหรือคล้ายกันเข้าด้วยกันในการทำ Index เพื่อให้เวลาคนค้นหาคำที่มีความหมายใกล้ๆ กัน ก็จะได้รับผลลัพธ์ที่ใกล้เคียงกันนั่นเอง

ความยากของการตัดคำก็เลยมีอีกว่า สำหรับคำที่ต้องเรียงลำดับให้ถูกในการแสดงผลการค้นหา เช่นคำว่า iPad Mini ก็ต้องเรียงให้ถูกถึงจะแสดงผลให้ถูก (ถ้าเสิร์ชเจอสินค้าชื่อ Mini iPad เราอาจจะได้ Tablet ปลอมแทน iPad Mini จาก Apple)

คราวนี้ปัญหาถัดมาคือการตัดคำภาษาไทย เพราะภาษาไทยไม่มี Spacebar และไม่มี Full Stop ทำให้การทำ Search Engine นั้นต้องมีการปรับแต่งไปตามแต่ละภาษา ทางเลือกหนึ่งของการตัดคำภาษาไทยก็คือการเทียบคำจาก Dictionary นั่นเอง (Priceza ไม่ได้มีแค่เว็บในไทย แต่ยังมีเว็บในประเทศเพื่อนบ้านรอบๆ อีกด้วย)

ส่วนการเรียงลำดับคำให้ถูกนั้น นอกจากจะเก็บค่า Index ว่าคำไหนอยู่ตรงไหนในบรรทัดไหนแล้ว Index เองก็ยังต้องทำการเก็บตำแหน่งของคำนั้นๆ ในแต่ละบรรทัดด้วยเพื่อให้รองรับกรณีของการค้นหาคำยาวๆ อย่าง iPad Mini ให้สามารถทำ Ranking ได้ว่าผลการค้นหาใดใกล้เคียงกับคำที่เราทำการค้นหาที่สุด

ทางด้านการค้นหานั้นจะแบ่งออกเป็นสองส่วนหลักๆ ด้วยกัน ได้แก่ Sort และ Filter ก็มีปัญหาอีกว่าบางคำเป็นภาษาอังกฤษ แต่คนเสิร์ชเป็นคำภาษาไทยแทน เช่น Canon/แคนอน เป็นต้น ก็ทำให้ต้องมีการแปลภาษาก่อน Search รวมถึงยังมีการจัดการการ Search หาคำที่พิมพ์ผิดให้เจอเป็นคำที่พิมพ์ถูกด้วย

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

การค้นหาแบบ Filtering ก็จะมีการแบ่งคำออกเป็น Category โดยใช้ Boolean ในการ Filter ว่าสินค้าใดอยู่ใน Category ไหน ก็ทำให้การเทียบเกิดขึ้นได้ค่อนข้างเร็ว และจะเป็นการจำกัดขอบเขตในการค้นหาลงด้วยก็จะทำให้ผลการค้นหาเกิดขึ้นได้เร็วยิ่งขึ้น และมีความเกี่ยงข้องกับสิ่งที่ถูก Search ได้สูงขึ้น

สำหรับเทคโนโลยีของตัว Search Engine ที่แนะนำก็คือ Lucene และมี Solr กับ Elasticsearch ที่แตกหน่อออกมา ก็ทำให้ปัจจุบันการสร้างเทคโนโลยีการ Search นั้นง่ายกว่าแต่ก่อนมากแล้ว

ส่วนอนาคตของเทคโนโลยีทางด้าน Search Engine นั้น ต่อไปก็คาดว่า Google อาจจะมีการนำ AI หรือ Machine Learning มาช่วยวิเคราะห์ด้วยว่าผู้ใช้งานแต่ละคนนั้นต้องการค้นหาคำนึงๆ ในบริบทไหนกันแน่ เช่น Canon จะเป็นกล้อง หรือจะเป็นปืนใหญ่ เป็นต้น โดยอาศัยข้อมูลแวดล้อมของผู้ใช้งานคนนั้นว่ามีความสนใจในเรื่องอะไร

นอกจากนี้ Priceza.com ก็ยังเปิดรับสมัครทีมงานเพิ่มนะครับ ใครสนใจก็เข้าไปดูตำแหน่งงานต่างๆ กันได้ที่ http://www.pricezagroup.com/join-our-team/ เลยครับ

priceza_founders


About techtalkthai

ทีมงาน TechTalkThai เป็นกลุ่มบุคคลที่ทำงานในสาย Enterprise IT ที่มีความเชี่ยวชาญทางด้าน Network, Security, Server, Storage, Operating System และ Virtualization มารวมตัวกันเพื่ออัพเดตข่าวสารทางด้าน Enterprise IT ให้แก่ชาว IT ในไทยโดยเฉพาะ

Check Also

Slack ออกฟีเจอร์ใหม่ช่วยผู้ดูแลจัดการองค์กรได้ง่ายขึ้น

Slack ได้ประกาศออกฟีเจอร์ใหม่หลายรายการที่จะช่วยให้ผู้ดูแลสามารถจัดการการใช้งานในองค์กรได้ง่ายขึ้น

[Guest Post] Hot Topic with Container and Microservices ::: ของร้อนๆที่ต้องรีบลองก่อนใคร

Docker แพลตฟอร์มสำหรับรัน Container Technology น้องใหม่ ที่ไม่ใหม่ เกิดขึ้นมาเพื่อแก้ปัญหาของระบบ Container และมาพูดคุยถึงการออกแบบ Storage ให้เหมาะสมกับระบบ Cloud Container ให้สามารถทำงานร่วมกันได้ดียิ่งขึ้น