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${solr.data.dir:} ↓${solr.data.dir:$SOLR_HOME/data}
- ライブラリのパスを変更する(相対パスになっているがどこが起点になってるのかよくわからん)
vim $SOLR_HOME/solrconfig.xml↓
↓
↓
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の下記コメントアウトを外す
10000 1000
- このままでは日本語が文字化けして検索にヒットしない問題
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
によると
server.xmlを修正
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/> ←追記
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)