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
によるとSolrRequestFilterより前に記載しないとだめらしい、、、(未確認)

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)