話說,來到這家公司,曾聽老闆說其他老闆告訴他,系統做怎樣都沒關係,重點在於"搜尋"
今天徹底研究了些Think Sphinx......我只有一個感想......
好的鐵道上的紅寶石讓你上天堂
好的思考中的人面獅身像讓你上宇宙X"D...
Sphinx是一個全文搜尋引擎,Thinking Sphinx則是Rails使用Sphinx的plugin,使用時必須先編譯安裝Sphinx才行,而類似的產品還有雪狐(acts_as_ferret / ferret),Apache的Solr(solr / acts_as_solr)[Java base,以前看過國外專案使用,和sphinx有點大同小異...不過難用許多]這邊只提供設定檔資訊,包含UTF8中文斷字的部份,基本的還是請看
Thinking Sphinx官方教學
花了些時間在建構sphinx.yml這個檔案,所以就直接丟上來了,因為行數太多所以不po code...因為光utf8的設定字符集就快三萬字元|||
這個檔基本上是丟在%PROJECT%/config/下,參考這篇設定
{|ihower.tw| blog } 全文搜尋 Sphinx on Rails,但沒有使用這篇的字符集(....被斷行|||)
而是
使用官方wiki的Common + CJK*段(charset_table)和CJK Ngram Characters(ngram_chars)
[CJK = Chinese, Japanese, and Korean ,設定檔內裡面兩萬多字元是utf8的CJK範圍對應碼]
而檔案內只有寫入development區段,也只用於範例的(bin_path請設你自己的,註解有找尋path的方法),所以要上production時,還是請參照一下你的環境再加以設定之類的,至於其他使用之類的應該官方說明都.....X"D 很糟糕的清楚,缺的部份應該就是這個檔案而已,所有字碼因為要詳細搜尋,所以用單碼斷句(......基本上是很終極的方式|||),所以應該亂搜尋都有,也用假文測試過之類的,效果很棒:P
話說,我第一次看到讀入yaml的時候會跑出"line too long"的錯誤...Orz",還好最後還是有解就是了:P,解法都在檔案內,請自行參閱
之後這一段source是我自動執行Think Sphinx的source code,來源其實很簡單,把think_sphinx的rake task解開,把source取出,指定成module名稱即可,因為直接用`rake thinx_sphinx...`會loop.....Orz"(swap跑到2G多X"D...),所以這樣的作法就不會再跑一次init,而是直接指定執行之類的,以下因為未經長時間測試,所以請斟酌使用,丟進init或是丟到......==w==||||很多地方可以丟...(like development.rb,這樣可以取消首行判斷....)
複製內容到剪貼板
代碼:
if ENV["RAILS_ENV"] == "development"
config = ThinkingSphinx::Configuration.instance
unless ThinkingSphinx.sphinx_running?
FileUtils.mkdir_p config.searchd_file_path
Dir["#{config.searchd_file_path}/*.spl"].each { |file| File.delete(file) }
config.controller.start
if ThinkingSphinx::Configuration.instance
puts "Started successfully (pid #{ThinkingSphinx.sphinx_pid})."
else
puts "Failed to start searchd daemon. Check #{config.searchd_log_file}"
end
end
unless ENV["INDEX_ONLY"] == "true"
puts "Generating Configuration to #{config.config_file}"
config.build
end
FileUtils.mkdir_p config.searchd_file_path
config.controller.index :verbose => true
end==w==我愛自動執行,打死都不想開個伺服器要打兩個指令,至於線上機請愛用定時執行 & 初始執行之類的方式來做哩
[2010/0210]
補上Sphinx的一些名詞解釋,尤其Fields & Attribute的分別,Thinking Sphinx教學內沒有的東西基本上都要看
Sphinx官方doc,或是去翻source code才行,畢竟Tinking Sphinx只是一個adapter之類的東西而已
Fields(Indexes):不管是怎樣的形態,都將會被強制轉型為String,除非指定sortable否則無法排序,是主要被全文搜尋的部份,包含自動斷字和片段查找,但被轉型為String的意思就是無法使用數值比對(大於/小於...),所以請盡量只丟不需判別,只需指定的欄位(like column > 3[判別], column.has("喵呼嚕")[包含/指定])
Attribute(has) :
不能做全文搜尋,但可以放進所有的型態(Int / Float / Date / Boolean...)還有全部類型的欄位都可以sort & filter,所以基本上Attribute應該是非文字欄位且不需全文搜尋的(無法搜尋內容是否含有某部分字串)