การค้นหาภาษาไทย

By มงคล

จากการใช้งาน Drupal และโปรแกรม ตปท. ต่างๆ จะพบว่า การค้นหาคำใน Database ด้วยภาษาไทย มักจะไม่ค่อยจะได้เรื่อง จึงพยามหาทางแก้ไขได้ หลากหลายวิธี เช่น

ใช้ google search ช่างเป็นระบบค้นหาที่สุดยอดอัจฉริยะ ยอดเยี่ยมยังกะมีที่พัฒนามืออาชีพปรับปรุงให้ดีขึ้นเรื่อยๆ แต่วิธีนี้ไม่สามารถ ใช้กับระบบ Intranet หรือข้อมูลที่ไม่สมควรเปิดเผยต่อสาธารณะชน และมันยังเป็น box ต่างหาก ไม่ฝังอยู่ในธีม

ดังนั้นจึงจำเป็นต้องหาทางแก้ไข Function search ขึ้นมาเอง (แต่โง่ PHP + SQL และยังไม่เข้าใจโครงสร้างของ Drupal) เลยดูเหมือนจะน๊อกตั่งแต่ยกแรก จึงอาศัยค้นคว้า จากผู้รู้แถวๆ นี้เป็นแนวทาง ได้มา 2 วิธี คือ

1. สร้างโมดูลขึ้นเอง เห็นคุณ wd ทำไว้ที่ http://www.thaitux.info/node/440 http://www.thaitux.info/node/441
2. แก้ไข function ค้นหาให้มันค้นหาภาษาไทยได้ คุณ jt เขียนไว้ที่ http://drupal.in.th/node/3485

เมื่อพิจารณาแล้ว เห็นว่ามีข้อดีคนละแบบ คือ
เป็น โมดูลสันชาติไทย ก็ดีที่ไม่ต้องไปแก้ไขวุ่นวายกับระบบ เมื่อ Update ก็ไม่ต้องระวังว่า Code จะถูกแก้กลับ และสามารถสร้างลูกเล่นได้อีกสารพัดโดยที่ไม่กระทบกับระบบ
ถ้าแก้ไข code ใน Module search เดิมที่มีอยู่ ก็ไม่ต้องเพิ่ม box และ module ฯลฯ แต่ มีข้อเสียที่เป็นข้อดีของแบบแรก

เมื่อผมพิจารณางานที่ผมทำ พบว่า ไม่ได้มีความต้องการให้มีลูกเล่นใดๆเพิ่มเติม ต้องการแค่ปุ่มค้นหา แบบเดิมๆ ที่หาคำในภาษาไทยได้ และปริมาณข้อมูลที่มีอยู่ค่อนข้างนิ่งคือ ปีหนึ่งๆมีเพิ่มไม่มาก และที่สำคัญ การเซตระบบโปรแกรมใช้เองอยู่คนเดียว ไม่มีการ update บ่อย ตราบเท่าที่ระบบยังใช้งานได้ จึงใช้วิธีที่ 2 (แม้เป็นวิธีที่ไม่ถูกหลักการนัก ที่ไปยู่งกับโมดูลมาตรฐาน) จึงไปศึกษาวิธีการของ คุณ jt ซึ่ง มีขั้นตอนง่ายๆ แค่ 2 อย่างคือ

ตัดระบบ กรองอักษรที่มันไม่รู้จักทิ้ง
เปลี่ยน เงื่อนไขการค้นหา จากต้องคำตรงกัน เป็นบางส่วนของตัวอักษรที่ติดกันก็ได้

ดูแล้วก็น่าจะใช้ได้ แต่มีความรู้สึกว่า ถ้าไม่กรองอักษร เอาเครื่องหมายต่างๆออกเสียเลย ไม่รู้ว่าจะมีผลที่ไม่คาดเดาอะไรบ้าง ส่วนการค้นหาบางส่วนของคำแทน ต้องค้นหาเป็นคำๆ แบบภาษาอังกฤษ ดูน่าจะเหมาะกับภาษาไทย ที่เขียนเรียงติดกันโดยไม่มีเว้นวรรคมากกว่า และ code ที่คุณ jt เขียนมา ก็น่าจะใช้ได้ได้อยู่แล้ว เหลือเพียง สอนภาษาไทยให้มันรู้จักบ้างก็น่าจะพอ

โดยทดลองมั่วทำตามความรู้อันน้อยนิดของผม ทำดังนี้

เข้าไปแก้ไข ไฟล์ /modules/search/search.module ทั้งหมด 3 จุด ดังนี้

จุดที่ 1 แก้ไข บรรทัด
define('PREG_CLASS_SEARCH_EXCLUDE',
'\x{0}-\x{2f}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{bf}\x{d7}\x{f7}\x{2b0}-'.
...
'\x{d3e}-\x{d57}\x{d82}\x{d83}\x{dca}-\x{df4}\x{e31}\x{e34}-\x{e3f}\x{e46}-'.
'\x{e4f}\x{e5a}\x{e5b}\x{eb1}\x{eb4}-\x{ebc}\x{ec6}-\x{ecd}\x{f01}-\x{f1f}'.
...

เป็น
define('PREG_CLASS_SEARCH_EXCLUDE',
'\x{0}-\x{2f}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{a0}\x{cf}-\x{ff}\x{2b0}-'.
...
'\x{d3e}-\x{d57}\x{d82}\x{d83}\x{dca}-\x{df4}\x{e3a}-\x{e3f}'.
'\x{e5a}\x{e5b}\x{eb1}\x{eb4}-\x{ebc}\x{ec6}-\x{ecd}\x{f01}-\x{f1f}'.
...
เพื่อไม่ให้มัน ยกเว้น อักษรไทยบางตัว ที่ค้นไม่ได้

จุดที่ 2 แก้ไข บรรทัด
define('PREG_CLASS_NUMBERS',
'\x{30}-\x{39}\x{b2}\x{b3}\x{b9}\x{bc}-\x{be}\x{660}-\x{669}\x{6f0}-\x{6f9}'.
...
เป็น
define('PREG_CLASS_NUMBERS',
'\x{30}-\x{39}\x{b2}\x{b3}\x{b9}\x{bc}-\x{be}\x{f0}-\x{fa}\x{660}-\x{669}\x{6f0}-\x{6f9}'.
...

เพื่อให้มันยอมรับเลขไทย

( ... หมายความว่า บรรทัดอื่นๆ ที่ไม่ได้ลงไว้ ให้คงเดิม)

จุดที่ 3 แก้ไข
$query2 = substr(str_repeat("i.word = '%s' OR ", count($arguments2)), 0, -4);
เป็น
$query2 = substr(str_repeat("i.word LIKE '%%%s%' OR ", count($arguments2)), 0, -4);
เพื่อให้มันหาบางส่วนของคำก็ได้

หลังจากแก้ไขเสร็จ บันทึกแล้ว ก่อนทดลอง ควรลบ cache index เดิมก่อน
เพราะ Index เดิมมันตัดอักษรภาษาไทยบางตัวออกไปแล้ว จะทำให้หาบางคำไม่เจอ
โดยเข้าที่ http://...../admin/settings/search คลิก [Re-index site] แล้ว
run corn ใหม่ http://...../admin/reports/status/run-cron เพื่อทำ index ใหม่

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

หมายเหตุ ตาราง unicode ที่แก้นี้ ตัวเลขอาจคลาดเคลื่อน ไปบ้างเพราะผมไม่มีตารางของ utf8 จึงได้แค่เดาแล้วลองดู ถ้าท่านใด มีข้อมูลที่ถูกต้อง หรือวิธีการใดที่ดีกว่า ช่วยแนะนำด้วย
และที่เขียนมาละเอียดนี้ มีวัตถุประสงค์ 2 ประการคือ
1. ให้ผู้รู้ช่วยแนะนำ แก้ไขให้ดีขึ้น
2. ให้ผู้ที่พบปัญหาเดียวกัน สามารถนำไปทดลองแก้ไขตาม เผื่อจะพอใช้งานได้
หาได้มีเจตนาปล่อยภูมิโง่(จริงๆ) อวดชาวโลกได้เห็นแต่ประการใดไม่

ของแถม!
สำหรับผู้ที่จะลองไปทดสอบการใช้งาน Copy ตัวที่แก้แล้วนี้ลงไปทับที่ /modules/search ได้เลย (แต่อย่าลืม copy ตัวเดิมไว้ก่อนนะ เผื่อ ค้นหาไทยแล้ว ไม่ถูกใจ จะได้ copy กลับมืคืนได้)
search.module สำหรับ Drupal 5
search.module สำหรับ Drupal 6
ทดลองใช้แล้วผลประการใด ตอบกลับให้คนที่มาต่อยอดได้ปรับปรุงกันบ้างนะ

5 comments

รูปภาพของ waterguy
By waterguy
1 ปี 23 weeks ago

ขอบคุณครับ

ขอบคุณครับ ที่เอาข้อมูลมาแบ่งปัน ขอบคุณจริงๆ

รอคนเก่งๆมาต่อยอดนะครับ ผมก็เฝ้ารอว่า เมื่อไรจะมีคนลงทุนแก้ และปรับแต่ง และส่ง ให้ Drupal Core แล้วผ่านสักที ภาษาจีน ก็ทำผ่านไปแล้วนะ เท่าที่จำได้ และอีกหลายภาษาที่ search ผ่าน core ได้เลย

รูปภาพของ OceanX
By OceanX
1 ปี 22 weeks ago

เยี่ยมไปเลย

เยี่ยมไปเลย ขอรับไปทดลองหน่อยน่ะครับ

รูปภาพของ jt
By jt
1 ปี 19 weeks ago

สุดยอดครับ ที่นี่รอคนอย่างคุณ

สุดยอดครับ ที่นี่รอคนอย่างคุณ มงคล นี่แหละ เรื่องการค้นหาภาษาไทย ยังคงต้องช่วยกันปรับปรุง ใครนำไปใช้แล้วมีปัญหาอะไร ก็มากบอกกันเยอะๆนะครับ ผมว่าจริงๆแล้ว เรามีคนเก่งๆเกี่ยวกับ drupal อยู่ที่นี่กันเยอะ น่าจะรวมตัวกัน เพื่อสร้างสรรค์อะไรได้อีกมากมาย ตอนนี้ผมกำลังเล็งๆจะทำ profile ไว้สำหรับใช้ตอนติดตั้ง เพราะเบื่อกับการลงใหม่ แล้วต้องมา set โน่นนี่ และยังต้อง install โมดูลเพิ่มอีก (ขอบ่นหน่อยละกัน) หรือเราจะสร้าง drupal ลายเครง แข่งกับ joomla ลายไทย ดี (ฮาๆ)

By Oranjer
1 ปี 19 weeks ago

อยากให้ต่อยอดครับ จะเป็นไปได้

อยากให้ต่อยอดครับ จะเป็นไปได้ไหมถ้าเรา ส่งโค๊ดนี้ไปให้ทาง drupal.org จะได้เป็นการแก้ไขแบบระยะยาวและยั่งยืน

รูปภาพของ maxasus123
By maxasus123
1 ปี 19 weeks ago

โอ้วดีมากๆๆเลยอครับ

โอ้วดีมากๆๆเลยอครับ