Open Source 的 Fulltext Search Engine 其實還蠻多套的,不過對於 UTF-8 環境來說,Fulltext Search 真正的問題在於非拉丁語系的切詞方式,而非底層的技術。
拉丁語系的切詞只要對標點符號及空白的地方切開,但非拉丁語系的語言 (像是 CJK) 並沒有辦法這樣做,解決的方法有幾種:最簡單的就是直接去找各國語言的詞庫 (以及頻率表),然後切詞,但這個方法對於新產生的詞沒有辦法處理,而且對於我們,不知道要如何取得非中文的詞庫。另外一種方法是完全透過 Algorithm 處理切詞,這樣我們就不用想辦法取得其他語言的詞庫,也不用管新的名詞出現。
我最近幫的忙是一個中文站台要對文章做全文搜尋 (UTF-8 環境,所以還是要考慮有少量的外國語言),目前站上的數量大約有 1 million 的文章要處理,文章數量會不斷成長。
當時在找的時候找到幾套軟體,最後因為切詞問題決定使用
HyperEstraier,一方面是作者相當活躍 (與
QDBM 同一個作者),另外一方面作者是日本人,我們認為日文與中文跑出來的效果應該不會差太多... (純粹是希望 :p)
在
FreeBSD 上安裝
HyperEstraier 沒什麼問題,直接到
ports 裡安裝就可以了,不過我們測試的結果發現有些地方需要改掉,以免影響 performance 太多。
我把 patch 檔放成 FreeBSD ports patch 的格式,所以只要把這兩個檔案放到
/usr/ports/textprocs/hyperestraier/files/
裡,再透過 ports 安裝就可以了。第一個檔案是
patch-estmaster.c
:
--- estmaster.c.orig Sat Dec 2 19:42:59 2006
+++ estmaster.c Sat Dec 2 19:44:45 2006
@@ -1258,6 +1258,7 @@
}
est_usleep(1000 * 100);
}
+#if 0
if(isec >= g_idleflush * (1.0 - g_cacheratio) &&
(g_cacheratio > 0.0 || isec % (g_idleflush / 2 + 1) == 0)){
if(g_stmode){
@@ -1301,6 +1302,7 @@
}
est_usleep(1000 * 100);
}
+#endif
}
free(stfile);
log_print(LL_INFO, "shutting down");
第二個檔案是
patch-estraier.c
:
--- estraier.c.orig Sat Nov 11 16:26:03 2006
+++ estraier.c Thu Nov 30 22:53:10 2006
@@ -2310,7 +2310,9 @@
}
}
db->dnum++;
+#if 0
if(est_db_used_cache_size(db) > db->icmax && !est_db_flush(db, INT_MAX)) err = TRUE;
+#endif
return err ? FALSE : TRUE;
}
其他的就照官方網站上所說的用法就可以了。另外一個很重要的資源是
PHP 存取
HyperEstraier 的方式,我自己是透過
EstraierPure 處理,測試起來沒什麼問題... :p