ย้ายบล็อกไปที่ bact.cc แล้วนะครับ

พ.ร.บ.คอมพิวเตอร์
หยุด ร่างพ.ร.บ.คอมพิวเตอร์
พื้นที่เก็บข้อมูลออนไลน์ ฟรี 2GB จาก Dropbox (sync กับ Windows, Linux, Mac, iPhone, Android ฯลฯ ได้)

2008-02-24

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: , , ,

6 comments:

samphan said...

ตามติดโครงการ OSS จริงๆ นับถือๆ
เห็น KMI เคยจ้าง อ.ท่านหนึ่งทำอยู่แล้วเลิกไป ตอนนี้ไม่รู้มีใครทำอยู่หรือเปล่า

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

Anonymous said...

ติดต่อดร.ธวัชชัยยังอะครับ?

bact' said...

veer: เมลไปบอกแล้ว

Anonymous said...

ดีเลยครับ

ทุกวันนี้ต้องใช้ 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

Anonymous said...

น่าสนุกดี :-)

bact' said...

พี่สัมพันธ์ ได้เปิดบั๊กไว้ที่นี่
http://bugs.mysql.com/bug.php?id=40122


มีคำแนะนำให้ลองตัวนี้

MySQL full-text parser plugin collection
http://mysqlftppc.wiki.sourceforge.net/