webzer.net

I blog to God but the sky is buggy ...


Search Thai module

ผ่านไป 3 เดือน นับตั้งแต่ การแฮ็คหน้าด้านๆครั้งแรก ในที่สุดก็มีเวลาว่างพอจะทำ Search Thai Module ให้เสร็จ ตอนแรกเปิดโปรเจ็คต์ไว้ก่อนที่ github.com แต่เผื่อบางทีใช้ Drush สะดวกกว่า Git ก็เลยเปิดโปรเจ็คต์ทางการไว้ซะเลยที่ drupal.org

ความตั้งใจคือทำ module ง่ายๆที่เพิ่มเติมความสามารถของ core search เดิมให้จัดการการค้นหาและทำดัชนีภาษาไทยได้ดีขี้น เพราะเห็นมี CJK Handling สำหรับจัดการภาษาจีน, ญี่ปุ่น และเกาหลีอยู่ เลยเอามาเป็นตัวอย่างสำหรับ Search Thai ได้ไม่ยาก แต่โดยส่วนตัวไม่ค่อยชอบ full-text search กับ database ของ Drupal เพราะใช้ Apache Solr เร็วและมีประสิทธิภาพกว่ามาก แต่ไม่ใช่ทุกคนจะติดตั้ง Solr ในเซิร์ฟเวอร์ได้ บางคนใช้ shared host ก็หมดสิทธิทำอะไรกับเซิร์ฟเวอร์ ก็เลยทำ module ไว้เป็นทางเลือก แม้จะไม่ใช่ทางเลือกที่ดีที่สุดแต่ก็คงพอแก้ขัดกันได้

อยากอธิบายว่า Search Thai ทำงานยังไง แต่ขี้เกียจ ลองดูใน code ก็น่าจะรู้กัน สั้นๆคือ ใช้ Regular Expression จัดการกับ Unicode range ของตัวอักษรไทย และใช้ตัวอักษรบางตัวเป็นตัวจำกัดขอบเขตของคำไทยก่อนที่จะเก็บเป็น tokens หรือชิ้นส่วนสำหรับประกอบเป็นคำไทยเพื่อการค้นหา พยายามหาวิธีลดขนาด search index ให้ได้มากที่สุด โดยตัดวรรณยุกต์และเครื่องหมายที่ไม่จำเป็นออกก่อนทำดัชนี มันจะได้ไม่นับเป็นตัวอักษร ตอนแรกตัดสระบนและล่างออกด้วยซ้ำไป แต่ได้ผลการค้นหาไม่ค่อยถูกต้องเท่าไหร่ เลยต้องเก็บสระไว้

สิ่งที่ยังขาดไปสำหรับ Search Thai Module คือ การตัดคำไทย และ การทำไฮไลต์ผลการค้นหา เพราะ Drupal ใช้ space และอักขระอื่นๆในภาษาอังกฤษเป็นตัวตัดคำและมันง่ายกว่าภาษาไทย ซึ่งภาษาเราเขียนแบบไม่เว้นช่องว่างระหว่างคำในประโยค เลยหา logic สำหรับนิยาม word boundary ลำบาก เคยลองเพิ่มพจนานุกรม อย่าง libthai เข้าไปแล้ว แต่ php ไม่เหมาะกับงาน regex กับพจนานุกรมที่มีคำเป็นหมื่นๆแน่ เล่นเอาเครื่องแฮงค์ไปเลย (ลองใช้ ruby ตัดคำไทยพอไหว แต่ก็ทรมาน cpu ไม่ใช่น้อยเหมือนกัน)

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