下一個項目準備用Python+Django來完成,先做些技術準備。資料庫方面用Django已經實驗的差不多了,但是似乎效能很差。自己編譯了Mysql,用虛擬機器測試,產生1000個使用者,1000篇文章用時80秒,這種並發效能恐怕沒有辦法讓人滿意。(每篇文章需要單獨產生Tag和文章與Tag的對應關係,涉及8次資料庫操作。)花了一天時間實驗InnoDB和MyIsam的區別,但是似乎沒有影響,開不開Transaction都一樣。先不管它了,也許和我的機器硬體有關係,硬體的sync關不掉。看官方的說法,SlashDot用Django可以實現每秒800條資料的插入速度。
網站肯定要用到全文檢索索引,目前唯一的全文檢索索引解決方案就是Lucene了,.Net上也有Lucene.Net可以選。搜尋了一下,發現了PyLucene,這個Python上的Lucene實現。似乎是使用Python對Lucene進行了一次重新封裝。
下載了它的Windows版本,安裝比較簡單,直接把幾個庫檔案複製到對應的Lib目錄就行了。運行了一下Sample目錄下的測試檔案,先是用IndexFiles和SearchFiles試了一下,SearchFiles是接收參數來搜尋的,但是我沒有辦法輸入中文,會出現錯誤提示。後來把要搜尋的詞直接放到檔案裡面去,不報錯了,但是搜尋不出來。本以為PyLucene不支援中文,正在納悶豆瓣的搜尋是怎麼做的,突然發現了一個好東西。
看了一下sample目錄下的LuceneInAction目錄,裡面居然有個ChineseTest檔案。它調用的是另一個目錄下的測試檔案,測試一個漢字的搜尋,運行了一下,居然是成功的。再看了一下IndexFiles,裡面讀檔案用的編碼是英文編碼,改成GB2312,OK,可以搜尋到了。但是只能搜尋單字,不能按詞搜尋。只要輸入兩個字就出錯。再比較一下Test檔案,Query的產生方法不一樣,TermQuery似乎是單元搜尋,不支援詞搜尋,換成了QueryParser,成功了。但是還有一個小問題,比如搜尋“中華”,在文章裡,在中和華中間隨便加多少空格和斷行符號都沒有關係,照樣可以搜尋到。但是加入其它字或者英文字母以後就搜尋不到了。這個影響不大,畢竟人們常用的搜尋都是自然詞。
有了PyLucene這個好東西,心頭一塊大石頭算是落地了。沒想到,等到要在程式開發伺服器的Linux上安裝這個東西的時候,可費了功夫了。
官方的下載包做的很奇怪,ubuntu, debian, gentoo都有對應的二進位包可用,但是Redhat就沒有,只能用源碼包編譯,而它的編譯方式又做的極其簡陋,沒有configure檔案,只有Makefile。按照說明,需要自己編輯Makefile,去掉你需要的注釋行,修改參數,然後直接Make。但是裡面有一個對DB的引用,檢查了一下,BerkeleyDB似乎在CentOS4裡面沒有,只好自己去官方網站下載了4.4.20的源碼,先編譯安裝它。雖然最新版是4.5.20,但是怕不相容,所以還是用它設定檔裡推薦的這個。編譯這個東西也挺奇怪,不過還好,畢竟有官方文檔一步步的說明,解壓後需要進入build_unix目錄,然後調用../dist/configure來配置,然後make && make install。指定prefix失敗。裝完了這個東西,再改PyLucene的設定檔,根據產生的錯誤訊息猜了好幾次才終於可以編譯了。最終需要改的地方為:
1、取消Linux那一段的注釋。
2、PREFIX_PYTHON是你的Python的目錄。因為我的Python是自己編譯安裝的,所以這裡需要改一下。
3、DB=這個我指向了BerkeleyDB的源碼目錄才通過編譯的(還好沒刪)。
其它的不用改。編譯到一半報錯,有一個libgcj.a檔案找不到,到/usr/lib下找了一下沒有這個檔案,但是有個差不多的.so,於是做了個ln -s,居然就通過編譯了。然後make install的時候又有問題,提示libgcc_s.so.1找不到,這個是Makefile裡面的LIB_INSTALL參數指定的,我不知道它的意義在哪裡,最後我也沒找到這個檔案,但是直接進入Sample目錄運行了一下測試檔案,居然就成功了。真TMD。這就是Linux嗎?
終於可以安心的研究Django了。似乎Ruby On Rails還沒有支援中文全文檢索索引的模組吧?