2012-01-20
■tomcat7とsolr3.5.0のセットアップ(日本語の文字化け対策も)
最新版のsolrとtomcatを準備
apache-tomcat-7.0.23
apache-solr-3.5.0
tomcat7のインストールパスを$TOMCAT
solrのインデックスファイルや設定ファイルを格納するパスを$SOLR_HOMEとする
- solrのWEBアプリケーションを$TOMCAT/webappに配備
$ cp apache-solr-3.5.0/example/webapps/solr.war $TOMCAT/webapps/
- デフォルトの設定ファイルやインデックスファイルなどをコピー
cp -r apache-solr-3.5.0/example/solr/* $SOLR_HOME/ ※apache-solr-3.5.0/exampleはexampleというよりはスケルトンに近い
- ライブラリをコピー
cp -r apache-solr-3.5.0/contrib $SOLR_HOME/ cp -r apache-solr-3.5.0/dist $SOLR_HOME/
- インデックスなどが格納されるデータディレクトリの設定を変更する
vim $SOLR_HOME/solrconfig.xml
<dataDir>${solr.data.dir:}</dataDir>
↓
<dataDir>${solr.data.dir:$SOLR_HOME/data}</dataDir>
- ライブラリのパスを変更する(相対パスになっているがどこが起点になってるのかよくわからん)
vim $SOLR_HOME/solrconfig.xml <lib dir="../../contrib/extraction/lib" /> <lib dir="../../contrib/clustering/lib/" /> <lib dir="../../contrib/velocity/lib" /> ↓ <lib dir="$SOLR_HOME/contrib/extraction/lib" /> <lib dir="$SOLR_HOME/contrib/clustering/lib/" /> <lib dir="$SOLR_HOME/contrib/velocity/lib" />
<lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar" /> <lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar" /> <lib dir="../../dist/" regex="apache-solr-dataimporthandler-\d.*\.jar" /> <lib dir="../../dist/" regex="apache-solr-langid-\d.*\.jar" /> <lib dir="../../dist/" regex="apache-solr-velocity-\d.*\.jar" /> ↓ <lib dir="$SOLR_HOME/dist/" regex="apache-solr-cell-\d.*\.jar" /> <lib dir="$SOLR_HOME/dist/" regex="apache-solr-clustering-\d.*\.jar" /> <lib dir="$SOLR_HOME/dist/" regex="apache-solr-dataimporthandler-\d.*\.jar" /> <lib dir="$SOLR_HOME/dist/" regex="apache-solr-langid-\d.*\.jar" /> <lib dir="$SOLR_HOME/dist/" regex="apache-solr-velocity-\d.*\.jar" />
<lib dir="../../contrib/clustering/lib/" /> ↓ <lib dir="$SOLR_HOME/contrib/clustering/lib/" />
- tomcat/bin/setenv.shにsolr.homeの環境変数を設定する
JAVA_OPTS="$JAVA_OPTS -Dsolr.home=$SOLR_HOME"
tomcat起動するとhttp://localhost:8080/solr/admin/で管理画面が見えていることを確認
- schema.xmlを設定してみる
<?xml version="1.0" encoding="UTF-8" ?> <schema name="example" version="1.4"> <types> <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100" > <analyzer> <tokenizer class="solr.CJKTokenizerFactory"/> </analyzer> </fieldType> </types> <fields> <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="name" type="text_cjk" indexed="true" stored="true" required="true" /> <field name="original_name" type="text_cjk" indexed="true" stored="true" required="true" /> <field name="kana" type="text_cjk" indexed="true" stored="true" required="true" /> <field name="name_en" type="text_cjk" indexed="true" stored="true" required="true" /> </fields> <uniqueKey>id</uniqueKey> <!-- field for the QueryParser to use when an explicit fieldname is absent --> <defaultSearchField>name</defaultSearchField> <!-- SolrQueryParser configuration: defaultOperator="AND|OR" --> <solrQueryParser defaultOperator="OR"/> </schema>
- autocommitをonにする
solr_home/conf/solrconfig.xmlの下記コメントアウトを外す
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>1000</maxTime>
</autoCommit>
- このままでは日本語が文字化けして検索にヒットしない問題
tomcatのexampleアプリケーションにSetCharacterEncodingFilter.classがあるのでそれを流用すると方法がネットで出てきた
http://blog.sedays.com/0409/2219_15.php
が、tomcat7にはなぜかSetCharacterEncodingFilter.classがない、、、、
$ ls -la apache-tomcat-7.0.23/webapps/examples/WEB-INF/classes/filters/
ExampleFilter.class
ExampleFilter.java
仕方ないのでtomcat6をダウンロードしてきてSetCharacterEncodingFilter.classを手に入れる
mkdir -p $TOMCAT/webapps/solr/WEB-INF/classes/filters cp apache-tomcat-6.0.35/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class .
solrアプリケーションにfilterを設定する
$ vim $TOMCAT/webapps/solr/WEB-INF/web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
http://kuromame.dip.jp/xoops/modules/pukiwiki/?solr
によると<filter-name>SolrRequestFilter</filter-name>より前に記載しないとだめらしい、、、(未確認)
server.xmlを修正
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true"/> ←追記
- データの流し込みはあえてjythonで行った(jython使ってみたかっただけ)
SolrJへのクラスパスを通した上でjythonを起動して以下のように実行
from org.apache.solr.client.solrj.impl import CommonsHttpSolrServer; from org.apache.solr.common import SolrInputDocument server = CommonsHttpSolrServer("http://localhost:8080/solr") doc = SolrInputDocument() doc.addField("id", dic['manageId']) doc.addField("name", dic['artistName']) doc.addField("original_name", dic['artistNameOriginal']) doc.addField("kana", (dic['artistNameKANA'] if (dic.has_key('artistNameKANA')) else "")) doc.addField("name_en", (dic['artistNameEN'] if (dic.has_key('artistNameEN')) else "")) server.add(doc)
