星期二, 12月 05, 2006

HyperEstraier 與 qdbm 的一些雜記

的使用了 的 Database 的部份以外,還使用了自己寫的輪子,cabin(3)。

這套輪子功能相當多,提供了許多 Data Structure Function 與 Algorithm 使用,不過如果真的要用的話,我也許會選擇其他 的 library (),像是 libisc (從 裡抽出來的)。

這次遇到 看起來有 memory-leak 的問題是 cabin(3) 的 cbmapout() 產生的。cbmap* 是處理 Hash 的 Data Structure Function,cbmapout() 會將元素從 Hash 中移出,不過我測試的結果發現移出後並不會釋放記憶體,於是就會造成 memory-leak 的「假象」,不過實際上這些記憶體會重複被使用,並沒有 memory-leak 的情況發生。這可能是因為 resize 的 overhead 考量而故意設計的。

所以塞資料進 要注意在塞一定的數量後對每個 node 下一次 sync 指令,強迫將快取的內容寫回硬碟後清掉,另外一個方法是把上一篇對 estmaster.c 的 patch 拿掉,這樣理論上在固定一段時間沒有動作後就會寫回去。(不過就不能一次大量寫進去,快取的大小會超過 process size...)

星期日, 12月 03, 2006

HyperEstraier

Open Source 的 Fulltext Search Engine 其實還蠻多套的,不過對於 UTF-8 環境來說,Fulltext Search 真正的問題在於非拉丁語系的切詞方式,而非底層的技術。

拉丁語系的切詞只要對標點符號及空白的地方切開,但非拉丁語系的語言 (像是 CJK) 並沒有辦法這樣做,解決的方法有幾種:最簡單的就是直接去找各國語言的詞庫 (以及頻率表),然後切詞,但這個方法對於新產生的詞沒有辦法處理,而且對於我們,不知道要如何取得非中文的詞庫。另外一種方法是完全透過 Algorithm 處理切詞,這樣我們就不用想辦法取得其他語言的詞庫,也不用管新的名詞出現。

我最近幫的忙是一個中文站台要對文章做全文搜尋 (UTF-8 環境,所以還是要考慮有少量的外國語言),目前站上的數量大約有 1 million 的文章要處理,文章數量會不斷成長。

當時在找的時候找到幾套軟體,最後因為切詞問題決定使用 ,一方面是作者相當活躍 (與 QDBM 同一個作者),另外一方面作者是日本人,我們認為日文與中文跑出來的效果應該不會差太多... (純粹是希望 :p)

FreeBSD 上安裝 沒什麼問題,直接到 裡安裝就可以了,不過我們測試的結果發現有些地方需要改掉,以免影響 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;
}

其他的就照官方網站上所說的用法就可以了。另外一個很重要的資源是 存取 HyperEstraier 的方式,我自己是透過 處理,測試起來沒什麼問題... :p