發新話題
打印

Thinking Sphinx設定 + 部分解釋

Thinking Sphinx設定 + 部分解釋

話說,來到這家公司,曾聽老闆說其他老闆告訴他,系統做怎樣都沒關係,重點在於"搜尋"
今天徹底研究了些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應該是非文字欄位且不需全文搜尋的(無法搜尋內容是否含有某部分字串)
附件: 您所在的用戶組無法下載或查看附件
(Plurk) 人因夢想而偉大,如果沒有信仰,則將一無所有,持續往殉道的路邁進,獻祭著自己的靈魂,走著最極端的路;而那迷霧的後面,會是地獄,也是天堂
self.attributes #=> [惡搞之魂,貓化身,怪咖吸鐵石,邪道程式設計師,動漫宅,蘿莉控,惡趣味,Geek,H=F^3]
[82,117,98,121,32,79,110,32,82,97,105,108,115,32,105,115,32,77,121,32,76,105,102,101].map{|l|l.chr}.to_s

TOP

wow, cool ,thank you for your post ;)

TOP

今天測搜尋,看了些東西想來相容我自己的東西,天殺的||||測了很久,之後才發覺Sphinx並不會定時搜尋,而是要加入cron(crontab)內才行....囧"....所以以下

[cron_indexer.sh]
複製內容到剪貼板
代碼:
#!/bin/sh -e

# Cron ReIndex ThinkSphinx ON RubyOnRails
# JokerCatz <lovingcatz@gmail.com>

# APPPATH MUST SET!!! (from / root)

app_path=/var/project/house

init_user=`whoami`
echo Cron ReIndex ThinkSphinx using User [$init_user]

temp_path=`pwd`
cd $app_path
echo "Cron ReIndex ThinkSphinx indexing"
rake thinking_sphinx:index RAILS_ENV=production
echo "Cron ReIndex ThinkSphinx indexed"
cd $temp_path

exit 0
記得專案路徑要修改過,之後配置crontab(ubuntu為例)
/etc/crontab內增加以下(5分鐘自動重新index為例)
複製內容到剪貼板
代碼:
*/5 *   * * *   root    /var/project/house/cron_indexer.sh
基本上到這邊應該就ok才是,而如果搜尋到已刪除或是被default_scope所過濾掉的,如
複製內容到剪貼板
代碼:
@items.each do |item|
    item #=> will be nil
end
所以搜尋頁需另外判定list出來的是否為過濾掉的物件,高興也可以給他一個專屬的相同大小的格子(方便列表),如"已被刪除",而不是單純的不吐html,不然會有"空格"的出現

okay以上,just for fun :)
(Plurk) 人因夢想而偉大,如果沒有信仰,則將一無所有,持續往殉道的路邁進,獻祭著自己的靈魂,走著最極端的路;而那迷霧的後面,會是地獄,也是天堂
self.attributes #=> [惡搞之魂,貓化身,怪咖吸鐵石,邪道程式設計師,動漫宅,蘿莉控,惡趣味,Geek,H=F^3]
[82,117,98,121,32,79,110,32,82,97,105,108,115,32,105,115,32,77,121,32,76,105,102,101].map{|l|l.chr}.to_s

TOP

發新話題