Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Gallery 3 的 Search 中文修正
post by tommy @ 16 十二月, 2011 15:13

Gallery 3 的 Search 模組中, 是透過 MySQLfull-text search 方式來處理, 不過... 這個方式對於 CJK 之類的文字, 由於無法分辨詞的斷點, 是無法正常運作的. 這個修改, 是把有非英文的 search, 改成 like 來處理 (東西一多, 也許效能會很差, 所以... 如果你的系統這樣子改之後, 找東西變很慢的話, 就不要用了).

diff -Nur gallery3.orig/modules/search/helpers/search.php gallery3/modules/search/helpers/search.php
--- gallery3.orig/modules/search/helpers/search.php 2011-05-25 12:04:04.000000000 +0800
+++ gallery3/modules/search/helpers/search.php 2011-12-16 15:10:51.490772461 +0800
@@ -36,6 +36,14 @@
 
static function search($q, $limit, $offset) {
$db = Database::instance();
+ // twu2 begin
+ // mysql full-text search is not work for CJK, so we won't do it
+ $not_ascii = false;
+ $x = preg_replace('/[\x80-\xFFFFFF]/', '', $q);
+ if ($x !== $q)
+ $not_ascii = true;
+ else
+ // twu2 end
$q = $db->escape($q);
 
if (!identity::active_user()->admin) {
@@ -47,6 +55,34 @@
$access_sql = "";
}
 
+ // twu2 begin
+ if ($not_ascii) {
+ $data_filter = '';
+ $items = explode(' ', $q);
+ foreach ($items as $v) {
+ $s = rtrim($v, '*');
+ if ($s === '') continue;
+ $s = str_replace('%', '\%', $s);
+ $s = str_replace('_', '\_', $s);
+ $s = $db->escape($s);
+ if ($data_filter == '')
+ $data_filter = "({search_records}.`data` LIKE '%$s%')";
+ else
+ $data_filter .= " OR ({search_records}.`data` LIKE '%$s%')";
+ }
+ if ($data_filter == '')
+ $data_filter = "({search_records}.`id` IS NULL)";
+ $query =
+ "SELECT SQL_CALC_FOUND_ROWS {items}.*, " .
+ " 1 AS `score` " .
+ "FROM {items} JOIN {search_records} ON ({items}.`id` = {search_records}.`item_id`) " .
+ "WHERE ($data_filter) " .
+ $access_sql .
+ "ORDER BY `name` DESC " .
+ "LIMIT $limit OFFSET $offset";
+ }
+ else
+ // twu2 end
$query =
"SELECT SQL_CALC_FOUND_ROWS {items}.*, " .
" MATCH({search_records}.`data`) AGAINST ('$q') AS `score` " .

這樣子改, 是可以找到資料.... 資料少的時候,速度應該也不會有問題. 等以後資料多的時候, 再看看會不會有什麼重大的效能影響吧.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

Tommy 您好:
我目前安裝的是Gallery 3.0.3 (Hotlanta),3.0.3 上的search.php 跟 3.0.2 的版本有部分程式不同。

我在搜尋相簿裡的中文字時,有些可搜尋到,有些又不能,因為是要拿Gallery3來製作校園植物網,所以搜尋中文的功能變得很需要。

煩請有空幫忙查看一下,謝謝您。

commons icon [2] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

應該只是把 search() 的內容拆到 _build_query_base() 去.
可以試看看 http://www.teatime.com.tw/~tommy/mypatch/gallery_303_cjk_search.patch
不過我目前沒用 Gallery 3, 不確定有沒有改錯.

commons icon [3] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

Tommy謝謝您的幫忙。

剛測試結果,搜尋半型字正常,搜尋全型字(中文),就會發生
「HTTP 錯誤 500 (Internal Server Error):」的問題。

commons icon [4] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

發現 $db->escape() 那兒在 3.0.3 有改過.
你可以重新抓一次, 或者直接把
$s = $db->escape($s);
改成
$s = Database::instance()->escape($s);
就可以.

我剛剛有裝一個起來測, 這樣改就不會出錯了.

commons icon [5] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

成功了!
已可以搜尋文章內的中文了。

之前的search 其實也是可以搜尋中文,但必須至少4個中文字,而且必須是整段的文字。現在可以搜尋部分文字了,一個字也可以。

謝謝您的幫忙。

commons icon [6] Re:Gallery 3 的 Search 中文修正 [ 回覆 ]

代码在3.0.4上可以工作(虽然要细心地组合一下),谢谢!

迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 139 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS