獨立安裝 solr 不難。 用 Chef 獨立安裝 solr 有一點點難。 用 Chef 裝出一個跟中文分詞套件 mmseg4j 能夠合的 solr 可真是地雷不少。

使用到的 cookbook:

cookbook 'hipsnip-jetty', git: 'https://github.com/hipsnip-cookbooks/jetty.git'
cookbook 'hipsnip-solr', git: 'https://github.com/hipsnip-cookbooks/solr.git'

設定:

default_attributes(
  java: {
    jdk_version: "7"
  },
  jetty: {
    port: "8983",
    version: "9.0.3.v20130506",
    link: 'http://eclipse.org/downloads/download.php?file=/jetty/9.0.3.v20130506/dist/jetty-distribution-9.0.3.v20130506.tar.gz&r=1',
    checksum: "eff8c9c63883cae04cec82aca01640411a6f8804971932cd477be2f98f90a6c4"
  },
  solr: {
    version: '4.3.1',
    checksum: '99c27527122fdc0d6eba83ced9598bf5cd3584954188b32cb2f655f1e810886b'
  }
)

這些是 Bert 大大測試出來 OK 的結果。他沒成功試出 opscode 官方版的 cookbook 的搭配。

這裡說一聲,Solr跟mmseg4j的搭配很挑的。 經過測試,Solr 4.2.1 跟 mmseg4j 1.9.1 2.0.0 2.0.1 都不相容。 Solr 4.3.1 也跟 2.0.1 不相容。 建議你先用以下嘗試出的結果。有美國時間再嘗試其他的組合。

接著請把 mmseg4j 的檔案下載下來:

正體中文版的字典檔(units.dic跟words.dic)可以從這裡抓: http://function1122.blogspot.tw/2010/10/mmseg4j-java-55.html 1.9.1的程式從這邊抓:https://code.google.com/p/mmseg4j/downloads/list

然後寫個 recipe 上傳這些檔案到遠端:

directory "#{node['solr']['home']}/lib" do
  owner 'app'
  group 'app'
  action :create
end

%w{mmseg4j-core-1.9.1.jar mmseg4j-solr-1.9.1.jar mmseg4j-analysis-1.9.1.jar}.each do |name|
  cookbook_file "#{node['solr']['home']}/lib/#{name}" do
    owner "app"
    group "app"
    source "solr/#{name}"
  end
end

directory "#{node['solr']['home']}/dic" do
  owner 'app'
  group 'app'
  action :create
end

%w{units.dic words.dic}.each do |name|
  cookbook_file "#{node['solr']['home']}/dic/#{name}" do
    owner "app"
    group "app"
    source "solr/dic/#{name}"
  end
end

然後就是設定 solr schema等等:

solr_schema (與sunspot搭配所以直接修改 text fieldType):

    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/usr/share/solr/dic"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

我用了絕對路徑指定字典檔,因為相對路徑不知道為何無用。

solr_solrconfig 添加:

  <lib dir="/usr/share/solr/lib/" regex=".*\.jar" />

因為 mmseg4j 我放在那裡。

然後就開始 cook 吧。

安裝途中要是發生問題是 jetty user logged in,那就手動登入用 pkill -KILL -u jetty 把他踢出吧。 hipsnip-solr cookbook 也要用新一點的,才會自動幫你把 logger lib裝好。

希望你裝的成功。

為了測試 solr 是否出現問題,我們在 vagrant 內暫時允許 solr web admin 頁面接收請求:

sudo ufw allow 8983

這樣你就能從 http://33.33.33.10:8983/solr/ 檢查 solr 設定是否正確。

選擇你的 core 裡面的 Analysis ,輸入「美國是按流量收費所以高速上網容量都會有所限制」,並選擇 type Text (注意不是 field Text),應該會有出現把「美國」分為一個詞成功。要是分成「美」「國」那就是沒抓到字典檔。

所有出現問題時都去 /var/log/jetty 下面找最新的 log 研究。

我在 local 用 vagrant 裝都沒事,但是在 production 上硬是發生 solr 還是使用舊的 4.2.1 版本。最後我把下面資料夾都刪掉:

- /usr/local/solr
- /user/share/solr
- /tmp/jetty*
- /tmp/hsperfdata*

然後把 Rails 之前有用到的 sunspot-solr gem 改為只在 development 讀取。