2015.10.18
64bit 的 Java 才能使用 4GB 以上的 RAM。
執行
uname -m如果顯示 x86_64 表示這是 64 bit kernel,如果顯示 i686 表示這是 32 bit kernel.
參考 Apache Solr Reference Guide => Managing Solr => Taking Solr to Production
如果安裝 default-jre,後面執行 Solr 安裝程式時會有錯誤訊息:
This script requires extracting a WAR file with either the jar or unzip utility, please install these utilities or contact your administrator for assistance.所以安裝 default-jdk
sudo apt-get install default-jdk查看 java 版本
java -version得到類似以下資訊
java version "1.7.0_79"OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)注意上面要有 64-bit 的字樣才是 64-bit 的 Java, 才能使用 4GB 以上的記憶體。
http://www.apache.org/dyn/closer.lua/lucene/solr/5.3.1
把 install_solr_service.sh 從壓縮檔裡取出來放在目前目錄
tar xzf solr-5.3.1.tgz solr-5.3.1/bin/install_solr_service.sh --strip-components=2執行安裝程式
sudo bash ./install_solr_service.sh solr-5.3.1.tgz這個安裝程式的預設值
安裝完作後,Solr 會安裝成一個 service 在背景執行 (port 8983). 可以執行以下命令驗證
sudo service solr statussudo ufw allow 8983這時從 client 連 http://xxx.ddbc.edu.tw:8983 應該可以看到 solr 管理界面。
Solr home 目錄預設是在 /var/solr/data,這個資料夾下會有一個 solr.xml.
編輯 /var/solr/solr.in.sh,根據實務情況設定記憶體:
#SOLR_HEAP="512m"SOLR_JAVA_MEM="-Xms16g -Xmx16g"從 solr 安裝目錄複製設定檔範例
sudo mkdir /var/solr/data/cbetasudo mkdir /var/solr/data/cbeta/datasudo touch /var/solr/data/cbeta/core.propertiessudo cp -a /opt/solr/server/solr/configsets/basic_configs/conf /var/solr/data/cbeta/confsudo chown -R solr:solr /var/solr/data/cbeta因為要整批大量匯入 CBETA 資料,最後才做 commit (solr 將變更寫入索引檔),否則容易產生 timeout,所以取消 autoCommit。
編輯 /var/solr/data/cbeta/conf/solrconfig.xml,把以下兩段註解掉:
<!-- <autoCommit> <maxTime>${solr.autoCommit.maxTime:15000}</maxTime> <openSearcher>false</openSearcher> </autoCommit>--><!-- <autoSoftCommit> <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime> </autoSoftCommit>-->編輯 /var/solr/data/cbeta/conf/schema.xml
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /><field name="canon" type="string" indexed="true" stored="true"/><field name="category" type="string" indexed="true" stored="true"/><field name="vol" type="string" indexed="true" stored="true"/><field name="work" type="string" indexed="true" stored="true"/><!-- 經號 --><field name="juan" type="int" indexed="true" stored="true"/><field name="edition" type="string" indexed="true" stored="true"/><!-- 宋元明等版本 --><field name="orig" type="boolean" indexed="true" stored="true"/><!-- 是否為底本 --><field name="text" type="text_general" indexed="true" stored="true"/>以上範例,需要哪些欄位可自行調整設定。我的設計是每一卷、每個校勘版本是獨立的一個檔。
根據上面 schema 的設計,將 CBETA XML P5a 轉為如下 XML 準備匯入 solr:
<add> <doc> <field name='id'>T0001.J1.ED:CBETA</field> <field name='category'>阿含部類</field> <field name='canon'>T</field> <field name='vol'>T01</field> <field name='work'>T0001</field> <field name='juan'>1</field> <field name='edition'>CBETA</field> <field name='orig'>false</field> <field name='text'>全文純文字放在這裡。</field> </doc></add>上面的 id 欄位是我隨便設定,不一定要按照這格式,只要是唯一的就好。
solr 也不強制一定要有 id 欄位。
使用如下 ruby 程式,將 xml 匯入 solr
require 'rsolr'solr = RSolr.connect :url => 'http://localhost:8983/solr/cbeta's = File.read('xxx.xml')solr.update :data => s上面程式是匯入一個檔的範例,以此為基礎,再另外寫程式將全部檔案匯入。
全部匯入完成後,使用如下 ruby 程式做 commit,告訴 solr 寫入 index:
require 'rsolr'solr = RSolr.connect :url => 'http://localhost:8983/solr/cbeta'solr.update :data => '<commit/>'