One step closer to Thai search in Drupal
การค้นหาใน Drupal มีปัญหากับภาษาไทยมานาน นานมากๆ สาเหตุก็เพราะ Drupal เลือกวิธีค้นหาที่ดีในระยะยาว ปกติพวก CMS จะชอบใช้ fulltext แต่ Drupal กลับเลือกทำอินเด็กซ์ด้วยตัวเอง วิธีนี้มีทั้งข้อดีข้อเสีย ในด้านดีมันทำให้ประสิทธิภาพของการค้นหาเมื่อมีข้อมูลมากๆ ดีกว่าการใช้ fulltext ที่พึ่งแต่ความสามารถของ MySQL ซึ่งไม่สามารถปรับปรุงแก้ไขอะไรได้ ในแง่ร้าย ภาษาไทยไม่ใช่ภาษาลาตินทั่วไป การตัดคำเป็นเรื่องยุ่งยากกว่าที่คิดมาก ไม่มีอะไรมาช่วยตัดโดยไม่ต้องอาศัยพจนานุกรม คำมีหลากหลาย สะกดผิดก็หาไม่เจอ
แต่ที่ว่ามาทั้งหมดยังไม่เลวร้ายเท่ากับปัญหาที่พึ่งสังเกตวันนี้ พึ่งรายงานปัญหานี้ไปที่ drupal.org ได้หมายเลข #335928 ใจความก็คือ แม้ว่าเราจะตัดคำด้วย hook_search_preprocess() แล้วก็ตาม Drupal จะไม่นำคำเหล่านั้นไปเก็บลงอินเด็กซ์เพราะดันเผลอตัด สระ วรรณยุกต์ ทิ้งเกือบหมด ทั้งนี้ Drupal อ้างอิงข้อมูลตัวอักษรจาก UnicodeData.txt ซึ่งระบุชนิดสระส่วนใหญ่เป็น Mn หรือ Mark, Nonspacing ซึ่ง Drupal สมมติว่าเป็นสัญลักษณ์ ตัดทิ้งได้ สามารถใช้ตัดคำได้ ลองดูโค้ดด้านล่าง
function search_simplify($text) { $text = decode_entities($text); $text = drupal_strtolower($text); search_invoke_preprocess($text); if (variable_get('overlap_cjk', TRUE)) { $text = preg_replace_callback('/['. PREG_CLASS_CJK .']+/u', 'search_expand_cjk', $text); } $text = preg_replace('/(['. PREG_CLASS_NUMBERS .']+)['. PREG_CLASS_PUNCTUATION .']+(?=['. PREG_CLASS_NUMBERS .'])/u', '\1', $text); $text = preg_replace('/[._-]+/', '', $text); $text = preg_replace('/['. PREG_CLASS_SEARCH_EXCLUDE .']+/u', ' ', $text); return $text; }
ตัวปัญหาอยู่ที่ PREG_CLASS_SEARCH_EXCLUDE นี่เอง
ก้าวแรกของการทำให้ Drupal ค้นหาภาษาไทยได้อย่างสมบูรณ์ก็คือแก้ปัญหานี้ก่อน ใครมีความเห็นเพิ่มเติมส่งไปที่ [#335928][] ได้ ผมไม่ค่อยเชี่ยวชาญภาษาไทยเท่าไหร่ อาจมีหลงลืมพลาดหูพลาดตา ยังไงก็ฝากดูกันหน่อยนะครับ จะได้ไม่ต้องแก้บ่อย
ถ้าสังเกตโค้ดจะเห็นว่ามี CJK โดยเฉพาะ เราคงต้องขยันมากขึ้น ถ้าจำเป็นต้องมีโค้ดภาษาไทยโดยเฉพาะ ตอนนี้ยังไม่จำเป็น
- Login to post comments







ผมไม่เข้าใจเรื่องโค้ดหรอกนะครับ รู้แต่ว่ามันยาก เพราะเวลาเขียนภาษาไทย ไม่ต้องมีช่องว่างระหว่างคำ (spaceless scripts) เคยอ่านเอกสารจาก unifont.org เขาก็บอกเหมือนที่คุณสุกรีว่าไว้ คือ ต้องมี dictionary ช่วยในซอฟต์แวร์ (หน้า 96) ส่วนภาษาลาว พม่า เขมร ก็ก็ชะตากรรมเดียวกับไทย (และอาจจะแย่กว่า)
ไม่ ทราบ ว่า จะ เข้า ใจ ปัญหา ถูกต้อง หรือ เปล่า แต่ อยาก จะ ให้ คํา แนะ นํา นี้ จะ ดู งี่ เง่า มั้ย นะ ถ้า จะ บอก ว่า จะ ต้อง ใช้ space ระ หว่าง คํา ทุก คํา ที่ พิมพ์
ขอบ คุณ ค่ะ
จริงๆแบบนี้ก็ดีนะ ตัดคำให้เองเลย แต่คนพิมพ์จะสับสนระหว่างอันไหนคือ space จริงๆ กับ space ตัดคำน่ะสิ
ไม่ เจอ กัน นาน นม โต ขึ้น จัง
จะ ไป กิน ข้าว กับ ขี้ พร้อม กัน เลย
อีกอย่าง ถ้าผมจะเขียนบทความซัก 10 pages คงเคาะ space กันมือหงิก (แซวขำๆนะครับ ^^)
การตัดคำนี้ไม่มีผลกับการแสดงผลครับ ตัดเพื่อให้ทำ search index ได้เท่านั้น