Apache Solr

 

solrのインストール

動かすまでが少し大変なsolr。絶対動く手順を公開します!tomcat7とseasarのdoltengを利用してsolr adminが起動する部分まで行います。solrのwarを直接使うとロガーの変更ができない等の問題があり、それを解決する事ができます。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

Seasarプロジェクトの作成方法ですが、eclipseプラグイン「dolteng」を利用すると簡単に作成可能です。

doltengのページに書かれたeclipse更新サイトからインストールします。

doltengのインストール

s2strutsやsastrutsはsolr adminと相性が悪い為、doltengで生成する際のプロジェクトは以下のようにします。

doltengのプロジェクトの作成1

Application Typeが「Web Application」だが、Presentationを未選択にするのがポイント。

Persistenceは任意で構いません。Server ManagementはWTPにするとよいです。

続いてパスの設定ですが、任意で構いません。

doltengのプロジェクトの作成2

solrのオフィシャルサイトからsolrをダウンロードします。

Apache Solr

apache-solr-3.6.1.zipを解凍すると以下のようなフォルダ構成で展開されます。

枠線内のファイルを使用します。

solrのインストール:フォルダ構成

solr.warをsolr.zipにリネームし、解答します。

solr adminのインストール1

solrフォルダの中身を、doltengで生成したプロジェクトのWebContentフォルダにコピーします。

WEB-INFフォルダは上書きしてしまって下さい。

solr adminのインストール2

jspがコンパイルエラーの表示になりますが問題ありません。

今回はtomcatを使うので、WEB-INF/weblogic.xmlは削除しておきます。

eclipseのメニューより、Window => Show View => Other => Server => Serversを選択し、ウインドウを表示します。

Serversタブ内で右クリックし、New => Serverと選択すると、以下の生成メニューが表示されます。

今回はtomcat7を使うのでtomcat7を選択して下さい。

Serversの設定1

nextボタンを押下し、先程作成したsolr-testプロジェクトを選択し、Addし、Finishボタンを押下して下さい。

doltengでWeb Application・WTPを選択していない場合、ここにsolr-testプロジェクトは表示されません。

Serversの設定2

Serversが新規作成されました。まだsolrのプロジェクトだけですが、今後sol-testのServerにWebアプリケーションを追加したりできます。

Serversの設定3

solr-testをダブルクリックすると、以下の様な設定ウインドウが表示されます。

Serversの設定4

設定は任意で構いません。

Serversを追加した事で、Serverプロジェクトの中にsolr-test-configというフォルダが生成されます。

solr-test-configフォルダ内にはServersで使用されるtomcatのconfが自動生成されています。

Serversの設定5

マルチコア構成にするため、まずはtest-solr-serverプロジェクト直下にsolrフォルダを作成し、そこにmulticoreフォルダ(core0、core1、solr.xml)をコピーします。

solrの設定2

solrは環境変数にsolr/homeというものを指定する必要があります。

solr/homeはtest-solr-server/solrのことです。

solr/homeが設定されていない状態でtomcatを起動すると、以下のようにエラーが発生してしまいます。

致命的: java.lang.RuntimeException: Can't find resource 'solrconfig.xml' in classpath or 'solr/./conf/', cwd=/Applications/eclipse/Eclipse.app/Contents/MacOS
	at org.apache.solr.core.SolrResourceLoader.openResource(SolrResourceLoader.java:273)
	at org.apache.solr.core.SolrResourceLoader.openConfig(SolrResourceLoader.java:239)
	at org.apache.solr.core.Config.<init>(Config.java:141)
	at org.apache.solr.core.SolrConfig.<init>(SolrConfig.java:138)
	at org.apache.solr.core.CoreContainer.create(CoreContainer.java:455)
	at org.apache.solr.core.CoreContainer.load(CoreContainer.java:335)
	at org.apache.solr.core.CoreContainer$Initializer.initialize(CoreContainer.java:165)
	at org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)

2012/05/09 0:27:42 org.apache.solr.servlet.SolrDispatchFilter init
致命的: Could not start Solr. Check solr/home property and the logs
org.apache.solr.common.SolrException: No cores were created, please check the logs for errors
	at org.apache.solr.core.CoreContainer$Initializer.initialize(CoreContainer.java:172)
	at org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
2012/05/09 0:27:42 org.apache.solr.core.CoreContainer finalize
致命的: CoreContainer was not shutdown prior to finalize(), indicates a bug -- POSSIBLE RESOURCE LEAK!!!  instance=99484925
2012/05/09 0:27:42 org.apache.solr.common.SolrException log
致命的: org.apache.solr.common.SolrException: No cores were created, please check the logs for errors
	at org.apache.solr.core.CoreContainer$Initializer.initialize(CoreContainer.java:172)
	at org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)

solr/homeの設定は、$TOMCAT_HOME/conf/server.xmlやJavaのオプションで設定できたりします。

Installing Solr instances under Tomcat

今回はtomcatのconfに設定します。solr wikiのサンプルでは以下のように記述されています。

<?xml version="1.0" encoding="utf-8"?>
<Context docBase="/opt/solr/example/solr/solr.war" debug="0" crossContext="true">
  <Environment name="solr/home" type="java.lang.String" value="/opt/solr/example/solr" override="true"/>
</Context>

早速設定してみます。まず、test-solr-server-config/server.xmlを開きます。

solr/homeの設定1

修正前

      <Context docBase="test-solr-server" path="/test-solr-server" reloadable="true" source="org.eclipse.jst.jee.server:test-solr-server"/></Host>
    </Engine>

修正後

    <Context docBase="test-solr-server" path="/test-solr-server" reloadable="false" source="org.eclipse.jst.jee.server:test-solr-server">
        <Environment name="solr/home" override="true" type="java.lang.String" value="/Applications/eclipse/workspace/test-solr-server/solr"/>
    </Context>

これでtomcat起動時にsolr/homeが自動設定されます。早速tomcatを起動してみましょう。

Serversタブのtest-solr-serverを右クリックし、Startを押下すると、tomcatが起動します。

ConsoleにStackTraceが表示されなければ起動成功です。

Consoleに色々表示されているのは、solrのコアやサーチャーやコンポーネントを読み込んでいるログです。

tomcat起動後、ブラウザでsolr adminを表示すると、以下のようにsolr adminのTOPが表示されます。

solr adminのTOPを表示

Admin core1リンクを押下すると以下のようにsolr admin(管理画面)が表示されます。

solr adminを表示

これで、solrのインストールが完了となります。

実はこのままではsolrで日本語が扱えません。日本語を扱えるよう設定をしましょう。

tomcatをUTF-8で動作するよう設定します。solr-test-config/server.xmlを以下のように修正します。

修正前

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

修正後

    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

続いて、test-solr-server/WebContent/WEB-INF/web.xmlを以下のように修正し、リクエスト毎にEncodingFilterでUTF-8になるよう設定します。

修正前

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <filter>
    <filter-name>SolrRequestFilter</filter-name>
    <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
・・・以下略・・・

修正後

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <filter>
    <filter-name>encodingfilter</filter-name>
    <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- Any path (name) registered in solrconfig.xml will be sent to that filter -->
  <filter>
    <filter-name>SolrRequestFilter</filter-name>
    <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
・・・以下略・・・

seasarのEncodingFilterを設定すると、<web-app>部分がエラーになったので修正がいるようです。

◯ 広告