MySQL Thai full-text parser plug-in idea

MySQL 5.1 allows us to use a customized full-text parser.

poakpong ถามเรื่อง fulltext ในฐานข้อมูล MySQL ว่าเอาไว้ทำอะไร

ก็คือมันเอาไว้ระบุไว้ที่ช่องข้อมูล (field) ประเภทข้อความ (char, varchar, text) เพื่อบอกให้ MySQL มันทำดัชนี (index) สำหรับการค้นหาแบบ full-text search น่ะ

ที่เคย ๆ เขียนกัน เวลาจะหาอะไรใน MySQL เราก็จะใช้ LIKE "%คำที่หา%"
โดย LIKE มันจะวิ่งไปเปรียบเทียบข้อความในแต่ละช่องข้อมูล ทำนอง regular expression

ส่วนกรณี full-text search ใน MySQL จะใช้คำสั่ง MATCH (ชื่อฟิลด์) AGAINST (คำที่หา)
ซึ่งมันจะค้นจากดัชนีคำที่ MySQL ทำไว้ล่วงหน้า ซึ่งการค้นหาที่ตัวดัชนีแทนที่จะไปหาในตัวข้อความทั้งหมดนี้ ก็จะทำให้การค้นหามีประสิทธิภาพดีกว่า

อย่างไรก็ตาม การใช้ full-text search นี้ ก็ยังมีปัญหาสำหรับภาษาไทย นั่นก็คือ ตัวทำดัชนีคำน่ะ มันยังไม่รองรับภาษาไทย-ภาษาที่ต้องตัดคำก่อน (มีรองรับภาษาจีน/ญี่ปุ่นนิดหน่อย)

full-text search จึงยังใช้ไม่ได้สำหรับภาษาไทย ต้องใช้ LIKE กันไปก่อน

ใน MySQL รุ่น 5.1 (ตอนนี้ยังเป็น Release Candidate อยู่) ปัญหานี้ดูเหมือนจะมีทางออกได้ (ถ้ามีคนลงแรง)
เพราะ MySQL 5.1 เปิดช่องให้เขียน plug-in มาเสริมการทำงานได้ ซึ่งรวมถึง full-text parser plug-in ด้วย

full-text parser นี่ มีเอาไว้สร้างรายการคำเพื่อเอาไปใส่ในดัชนี

ถ้าเรามี full-text parser ที่สร้างรายการคำไทยได้ เราก็จะสามารถใช้ฟังก์ชั่น full-text search บน MySQL กับภาษาไทยได้ทันที ที่ระดับฐานข้อมูลเลย (แน่นอน เราต้องมีสิทธิลงปลั๊กอินที่ว่าลงในเซิร์ฟเวอร์ฐานข้อมูลด้วย ซึ่งในกรณีเราไปเช่าเว็บโฮสต์คนอื่นใช้ ก็คงลำบากหน่อย แต่ถ้าเป็นเครื่องเราเอง ก็ไม่มีปัญหา)

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

เป็นโครงงานจบการศึกษา – senior project – Google Summer of Code – ประกวด NSC … ??

(ภาษาโปรแกรม C หรือ C++)

(อาจจะมีคนทำอยู่/เสร็จแล้วก็ได้ … เหมือน อ.ธวัชชัย กับ พี่สัมพันธ์ เคยสนใจ (แต่ตอนนั้นโครงสร้างพื้นฐานยังไม่อำนวยให้แก้ไขได้ในลักษณะปลั๊กอินเช่นนี้) … ใครรู้อะไรก็แจ้งข่าวหน่อยครับ 😉 )

technorati tags: 

Published by

bact

bact' is a name

6 thoughts on “MySQL Thai full-text parser plug-in idea”

  1. ตามติดโครงการ OSS จริงๆ นับถือๆเห็น KMI เคยจ้าง อ.ท่านหนึ่งทำอยู่แล้วเลิกไป ตอนนี้ไม่รู้มีใครทำอยู่หรือเปล่าอีกเรื่องที่ผมไม่ได้ตามคือ Scribus ไม่รู้ว่า หลังจากที่ซิป้าเชียงใหม่จ้างทำไทย (เร็วไปหน่อย) แล้วเลิกไป ตอนนี้ควรจะเข้าไปแก้เรื่องตัดคำมันหรือยัง และมีใครดูอยู่ไหม เพราะจริงๆ อยากใช้มาก เพราะไม่มีตังซื้อ DTP ใช้

  2. ดีเลยครับทุกวันนี้ต้องใช้ Hibernate Search ที่ข้างล่างใช้ Lucene อยู่ (พี่สัมพันธ์เขียนตัวตัดคำไทย)แม้ Hibernate Search จะทำให้ง่ายขึ้น (map lucene field เข้ากับ property) ผมก็ว่ามันยังมีรายละเอียดยิบย่อยต้องปรับเยอะอยู่ดีถ้า MySQL ทำเองก็ดีครับ ในกรณี ที่เราต้องการ search สิ่งที่อยู่ใน db อย่างเดียวเห็นด้วยนะว่างานนี้ทำเป็น senior project หรือเป็น Google Summer of Code ได้แต่มีคำถามข้างทางอยู่ที่ว่าใช้วิธีนี้แล้วมันจะใช้ร่วมกับ lucene index ได้ง่ายแล้วไม่ซ้ำซ้อน บริหารยากหรือเปล่าโครงการ 2 ก็ต่อยอดเอา index ของ MySQL รวมเข้ากับของ lucene : P

Leave a Reply