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++)
- วิธีเขียนปลั๊กอิน MySQL
- ตัวอย่างโครงสร้างปลั๊กอิน full-text parser
- โครงการ full-text parser ต่าง ๆ ที่ MySQL Forge (ตัว n-gram full-text parser น่าสนใจ)
(อาจจะมีคนทำอยู่/เสร็จแล้วก็ได้ … เหมือน อ.ธวัชชัย กับ พี่สัมพันธ์ เคยสนใจ (แต่ตอนนั้นโครงสร้างพื้นฐานยังไม่อำนวยให้แก้ไขได้ในลักษณะปลั๊กอินเช่นนี้) … ใครรู้อะไรก็แจ้งข่าวหน่อยครับ 😉 )
technorati tags: MySQL, Thai, plug-in, full-text search
6 responses to “MySQL Thai full-text parser plug-in idea”
ตามติดโครงการ OSS จริงๆ นับถือๆเห็น KMI เคยจ้าง อ.ท่านหนึ่งทำอยู่แล้วเลิกไป ตอนนี้ไม่รู้มีใครทำอยู่หรือเปล่าอีกเรื่องที่ผมไม่ได้ตามคือ Scribus ไม่รู้ว่า หลังจากที่ซิป้าเชียงใหม่จ้างทำไทย (เร็วไปหน่อย) แล้วเลิกไป ตอนนี้ควรจะเข้าไปแก้เรื่องตัดคำมันหรือยัง และมีใครดูอยู่ไหม เพราะจริงๆ อยากใช้มาก เพราะไม่มีตังซื้อ DTP ใช้
ติดต่อดร.ธวัชชัยยังอะครับ?
veer: เมลไปบอกแล้ว
ดีเลยครับทุกวันนี้ต้องใช้ 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
น่าสนุกดี 🙂
พี่สัมพันธ์ ได้เปิดบั๊กไว้ที่นี่http://bugs.mysql.com/bug.php?id=40122มีคำแนะนำให้ลองตัวนี้MySQL full-text parser plugin collectionhttp://mysqlftppc.wiki.sourceforge.net/