最近、Apache Solrを使うことになりそうなので、ちょっと勉強してみようかと。
Apache Solr
http://lucene.apache.org/solr/
完全に初めて、とは言えませんが、限りなくそれに近い状態でApache Solrを使います。
Quick Startを参考にして、進めていってみましょう。
Solr Quick Start
http://lucene.apache.org/solr/quickstart.html
インストール
まずは、インストールからですね。
ダウンロード、展開。
$ wget http://ftp.tsukuba.wide.ad.jp/software/apache//lucene/solr/5.3.0/solr-5.3.0.tgz
$ tar -zxvf solr-5.3.0.tgz
ディレクトリを移動。
$ cd solr-5.3.0
Solrの操作には、以下のスクリプトを使用すればよいみたいです。
$ bin/solr Usage: solr COMMAND OPTIONS where COMMAND is one of: start, stop, restart, status, healthcheck, create, create_core, create_collection, delete Standalone server example (start Solr running in the background on port 8984): ./solr start -p 8984 SolrCloud example (start Solr running in SolrCloud mode using localhost:2181 to connect to ZooKeeper, with 1g max heap size and remote Java debug options enabled): ./solr start -c -m 1g -z localhost:2181 -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044" Pass -help after any COMMAND to see command-specific usage information, such as: ./solr start -help or ./solr stop -help
コマンドに対して「-help」を付与することで、ヘルプを見ることができます。
$ bin/solr start -help
Solrを起動する
それでは、Solrを起動してみます。
Quick Startでは「-e cloud」付きで起動していますが、これはSolrCloudのサンプルを使って起動するものみたいです。
というわけで、まずは普通に起動してみます。
$ bin/solr start NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983. Started Solr server on port 8983 (pid=353). Happy searching!
起動したようです。
Quick Startでは「-noprompt」というオプションが付いていますが、これはSolrCloudなどのサンプルを使用する場合に、対話形式とならないようにするものです。普通に「solr start」とする分には、意味がなさそうな模様。
なお、ちょっとビックリしたのは、Solr 5ではTomcatなどのServletコンテナへのデプロイは、サポートしなくなったようです。
※solr.warがない
No Longer Supported
Beginning with Solr 5.0, Support for deploying Solr as a WAR in servlet containers like Tomcat is no longer supported.For information on how to install Solr as a standalone server, please see Installing Solr.
https://cwiki.apache.org/confluence/display/solr/Running+Solr+on+Tomcat
知らなかった…。
Solrの停止
停止は、以下のコマンドで。
$ bin/solr stop Sending stop command to Solr running on port 8983 ... waiting 5 seconds to allow Jetty process 353 to stop gracefully.
管理画面を見てみる
もう1度Solrを起動。
$ bin/solr start
この時に、「http://localhost:8983/」にアクセスすると、Solrの管理画面が見れます。
※すぐさま、「http://localhost:8983/solr/#/」に移動させられますが
管理画面は、Solr 3の頃しか知らないのですが、だいぶ雰囲気変わりましたねぇ…。
サービスとしてインストールする
スタンドアロンなサーバーとなったSolrですが、サービスとして組み込むための、initスクリプトが付属するようになったみたいです。
「bin/install_solr_service.sh」というスクリプトです。
# tar -zxvf solr-5.3.0.tgz solr-5.3.0/bin/install_solr_service.sh
ちなみに、基本的にこの一連のコマンドの操作はrootで行います。
この「bin/install_solr_service.sh」の引数に、Solrのアーカイブを指定して実行します。
# solr-5.3.0/bin/install_solr_service.sh solr-5.3.0.tgz
すると、solrユーザーが作られ、アーカイブが展開され、サービスとしてSolrがインストールされます。
id: solr: no such user Creating new user: solr Adding system user `solr' (UID 102) ... Adding new group `solr' (GID 105) ... Adding new user `solr' (UID 102) with group `solr' ... Creating home directory `/home/solr' ... Extracting solr-5.3.0.tgz to /opt Creating /etc/init.d/solr script ... Adding system startup for /etc/init.d/solr ... /etc/rc0.d/K20solr -> ../init.d/solr /etc/rc1.d/K20solr -> ../init.d/solr /etc/rc6.d/K20solr -> ../init.d/solr /etc/rc2.d/S20solr -> ../init.d/solr /etc/rc3.d/S20solr -> ../init.d/solr /etc/rc4.d/S20solr -> ../init.d/solr /etc/rc5.d/S20solr -> ../init.d/solr NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983. Started Solr server on port 8983 (pid=124). Happy searching! Found 1 Solr nodes: Solr process 124 running on port 8983 { "solr_home":"/var/solr/data/", "version":"5.3.0 1696229 - noble - 2015-08-17 17:10:43", "startTime":"2015-09-05T13:55:47.712Z", "uptime":"0 days, 0 hours, 0 minutes, 15 seconds", "memory":"76.1 MB (%15.5) of 490.7 MB"} Service solr installed.
この時点で、Solrが起動しています。
# service solr status Found 1 Solr nodes: Solr process 124 running on port 8983 { "solr_home":"/var/solr/data/", "version":"5.3.0 1696229 - noble - 2015-08-17 17:10:43", "startTime":"2015-09-05T13:55:47.712Z", "uptime":"0 days, 0 hours, 0 minutes, 54 seconds", "memory":"82.4 MB (%16.8) of 490.7 MB"}
停止。
# service solr stop Sending stop command to Solr running on port 8983 ... waiting 5 seconds to allow Jetty process 124 to stop gracefully.
起動。
# service solr start NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983. Started Solr server on port 8983 (pid=503). Happy searching!
…よく見ると、「lsof」入れた方がいいって言ってますね…。
lsofインストール後にもう1度起動すると、こんな感じになりました。
# service solr start Waiting up to 30 seconds to see Solr running on port 8983 [\] Still not seeing Solr listening on 8983 after 30 seconds! 2015-09-05 13:58:20.415 INFO (main) [ ] o.e.j.u.log Logging initialized @265ms 2015-09-05 13:58:20.554 INFO (main) [ ] o.e.j.s.Server jetty-9.2.11.v20150529 2015-09-05 13:58:20.568 WARN (main) [ ] o.e.j.s.h.RequestLogHandler !RequestLog 2015-09-05 13:58:20.570 INFO (main) [ ] o.e.j.d.p.ScanningAppProvider Deployment monitor [file:/opt/solr-5.3.0/server/contexts/] at interval 0 2015-09-05 13:58:21.584 INFO (main) [ ] o.e.j.w.StandardDescriptorProcessor NO JSP Support for /solr, did not find org.apache.jasper.servlet.JspServlet 2015-09-05 13:58:21.597 WARN (main) [ ] o.e.j.s.SecurityHandler ServletContext@o.e.j.w.WebAppContext@e25b2fe{/solr,file:/opt/solr-5.3.0/server/solr-webapp/webapp/,STARTING}{/opt/solr-5.3.0/server/solr-webapp/webapp} has uncovered http methods for path: / 2015-09-05 13:58:21.603 INFO (main) [ ] o.a.s.s.SolrDispatchFilter SolrDispatchFilter.init(): WebAppClassLoader=117244645@6fd02e5 2015-09-05 13:58:21.615 INFO (main) [ ] o.a.s.c.SolrResourceLoader JNDI not configured for solr (NoInitialContextEx) 2015-09-05 13:58:21.617 INFO (main) [ ] o.a.s.c.SolrResourceLoader using system property solr.solr.home: /var/solr/data 2015-09-05 13:58:21.619 INFO (main) [ ] o.a.s.c.SolrResourceLoader new SolrResourceLoader for directory: '/var/solr/data/' 2015-09-05 13:58:21.748 INFO (main) [ ] o.a.s.c.SolrXmlConfig Loading container configuration from /var/solr/data/solr.xml 2015-09-05 13:58:21.802 INFO (main) [ ] o.a.s.c.CoresLocator Config-defined core root directory: /var/solr/data 2015-09-05 13:58:21.821 INFO (main) [ ] o.a.s.c.CoreContainer New CoreContainer 576020159 2015-09-05 13:58:21.821 INFO (main) [ ] o.a.s.c.CoreContainer Loading cores into CoreContainer [instanceDir=/var/solr/data/] 2015-09-05 13:58:21.821 INFO (main) [ ] o.a.s.c.CoreContainer loading shared library: /var/solr/data/lib 2015-09-05 13:58:21.821 WARN (main) [ ] o.a.s.c.SolrResourceLoader Can't find (or read) directory to add to classloader: lib (resolved as: /var/solr/data/lib). 2015-09-05 13:58:21.835 INFO (main) [ ] o.a.s.h.c.HttpShardHandlerFactory created with socketTimeout : 600000,connTimeout : 60000,maxConnectionsPerHost : 20,maxConnections : 10000,corePoolSize : 0,maximumPoolSize : 2147483647,maxThreadIdleTime : 5,sizeOfQueue : -1,fairnessPolicy : false,useRetries : false, 2015-09-05 13:58:22.059 INFO (main) [ ] o.a.s.u.UpdateShardHandler Creating UpdateShardHandler HTTP client with params: socketTimeout=600000&connTimeout=60000&retry=true 2015-09-05 13:58:22.062 INFO (main) [ ] o.a.s.l.LogWatcher SLF4J impl is org.slf4j.impl.Log4jLoggerFactory 2015-09-05 13:58:22.062 INFO (main) [ ] o.a.s.l.LogWatcher Registering Log Listener [Log4j (org.slf4j.impl.Log4jLoggerFactory)] 2015-09-05 13:58:22.064 INFO (main) [ ] o.a.s.c.CoreContainer Security conf doesn't exist. Skipping setup for authorization module. 2015-09-05 13:58:22.064 INFO (main) [ ] o.a.s.c.CoreContainer No authentication plugin used. 2015-09-05 13:58:22.092 INFO (main) [ ] o.a.s.c.CoresLocator Looking for core definitions underneath /var/solr/data 2015-09-05 13:58:22.093 INFO (main) [ ] o.a.s.c.CoresLocator Found 0 core definitions 2015-09-05 13:58:22.101 INFO (main) [ ] o.a.s.s.SolrDispatchFilter user.dir=/opt/solr-5.3.0/server 2015-09-05 13:58:22.101 INFO (main) [ ] o.a.s.s.SolrDispatchFilter SolrDispatchFilter.init() done 2015-09-05 13:58:22.111 INFO (main) [ ] o.e.j.s.h.ContextHandler Started o.e.j.w.WebAppContext@e25b2fe{/solr,file:/opt/solr-5.3.0/server/solr-webapp/webapp/,AVAILABLE}{/opt/solr-5.3.0/server/solr-webapp/webapp} 2015-09-05 13:58:22.123 INFO (main) [ ] o.e.j.s.ServerConnector Started ServerConnector@46d95499{HTTP/1.1}{0.0.0.0:8983} 2015-09-05 13:58:22.123 INFO (main) [ ] o.e.j.s.Server Started @1975ms
なお、「bin/install_solr_service.sh」スクリプトには引数をつけることができ、
- -d … ログ、インデックスなどを保存するディレクトリ(デフォルト:/var/solr)
- -i … Solrのアーカイブを展開するディレクトリ(デフォルト:/opt/)
- -p … Solrが使用するポート(デフォルト:8983)
- -s … サービス名(デフォルト:solr)
- -u … Solrのファイルやプロセスのユーザー(デフォルト:solr)
となります。
つまり、先ほどのスクリプトに明示的にデフォルト値を付与すると、以下のようになるわけですね。
# solr-5.3.0/bin/install_solr_service.sh solr-5.3.0.tgz -d /var/solr -i /opt/ -p 8983 -s solr -u solr
参考)
Solr 5.0 リリース!
http://blog.yoslab.com/entry/2015/02/25/031002
Lucene 5.0 に対応した Apache Solr 5.0 がリリースされてた
http://qiita.com/ma2saka/items/d13787b0582b4116b0b5
Apache Solr 5.x を使った検索システムの構築
http://alpha-netzilla.blogspot.jp/2015/06/solr.html
Solr 5.1をCentOS 7上で動かしてみる
http://open-groove.net/solr/solr5-on-centos7/
オマケ
サービスとしてインストールするとこまでのDockerfileを作っておいたので、興味があれば。
Dockerfile
FROM ubuntu:latest ENV JAVA_HOME /usr/lib/jvm/java-8-oracle ENV SOLR_VERSION 5.3.0 ENV SOLR_ARCHIVE solr-${SOLR_VERSION}.tgz ENV SOLR_INSTALL_DIR /opt ENV SOLR_DATA_DIR /var/solr ENV SOLR_PORT 8983 ## Oracle JDK 8インストール RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ apt-get install -y software-properties-common && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update && \ apt-get install -y oracle-java8-installer ## ツールインストール RUN apt-get install -y lsof \ curl \ vim ## 日本語環境サポート RUN apt-get install -y language-pack-ja-base \ language-pack-ja \ ibus-mozc \ man \ manpages-ja && \ update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja ENV LANG ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 ENV LC_CTYPE ja_JP.UTF-8 ## Solrインストール RUN wget -q http://ftp.jaist.ac.jp/pub/apache//lucene/solr/${SOLR_VERSION}/${SOLR_ARCHIVE} && \ tar -zxvf ${SOLR_ARCHIVE} solr-${SOLR_VERSION}/bin/install_solr_service.sh && \ solr-${SOLR_VERSION}/bin/install_solr_service.sh ${SOLR_ARCHIVE} -i ${SOLR_INSTALL_DIR} -d ${SOLR_DATA_DIR} -p ${SOLR_PORT} EXPOSE ${SOLR_PORT} ## 実行コマンド ENTRYPOINT service solr start && tail -f /dev/null