概要
intra-martのIM-ContentsSearchを利用するにあたり、Apache Solrを入れろとあります。
これをdockerでやろうというものです。
まずはDockerHubでベースイメージを探す
intra-mart Accel Platform 2016 Spring (Maxima) リリースノートの、5.1.2.2. Apache Solr システム要件には、次のように記述されています。
5.1.2.2.1. サポートバージョン
Apache Solr 3.6.x
このバージョンを求めて、オフィシャルイメージを探します。
欲しいバージョンが古すぎなのか、ありません。
intra-mart用のcassandraを立てたときにも同じように古すぎてない、というのを経験したので、慣れっこです。
早く開発本部の中の人とか、本家の人が公開すると良いと思います。
公式の手順に従う
セットアップガイドによると、セットアップツールを使うと、antタスクでjettyサーバでSolrがすぐに動くと。
これをDockerfileに記述します。
FROM java:8-jdk-alpine
ENV SOLR_SETUP_DIR /usr/local/solr
RUN apk --no-cache --virtual=dependencies add wget unzip && \
wget "http://www.intra-mart.jp/download/product/iap/im_contents_search/solr_setup.zip" && \
mkdir $SOLR_SETUP_DIR && \
unzip solr_setup.zip -d $SOLR_SETUP_DIR && \
apk del dependencies
WORKDIR $SOLR_SETUP_DIR
CMD ["./setup.sh", "jetty.start"]
EXPOSE 8983
これをビルドしたのち、docker runしてやると、jettyサーバ上でSolrが動きはじめます。
docker run -d -p 8983:8983 <ビルドしたイメージ名>
絶対パスと相対パス
Jetty(開発向け)のサーバ起動方法には、以下のようにあります。
Linuxの場合
/usr/local/solr/setup.sh jetty.start
ただ、上のDockerfileでこれをやりますと、こんなエラーになりました。
/usr/local/solr/setup.sh: line 6: build/lib/ant/bin/ant: not found
相対パスでやると、動くようです。不思議。
Solrの起動確認
http://<ホスト>:8983/solr/default/admin/
にアクセスし、Solrの管理画面が開けることを確認する。
intra-mart側の設定
システム管理者の画面
Solr接続設定
「システム環境構築」の画面から「Solr接続設定」を開き、「新規作成」を行う。
検索/索引サーバで指定する値は、先ほどSolrの起動確認画面で開いた管理画面のURLからadminを抜いたもの、と思っておけばよさげ。
設定値 | 値 | 備考 |
---|---|---|
接続名 | solr-docker | 任意の値 |
検索サーバ | http://<ホスト>:8983/solr/default | 既定のコア名がdefaultなので |
索引サーバ | http://<ホスト>:8983/solr/default | 既定のコア名がdefaultなので |
「テスト接続」を押下して、接続できることを確認します。
接続が成功していると、Solrサーバ側にログが落ちるので、これを確認できます。
docker logs <Solrコンテナ名>
テナントSolr接続設定
「システム環境構築」で設定したSolrサーバを、テナントに対して割り当てます。
割り当てないと、テナントに対して検索サーバがない、ということになり、検索時にエラーとなります。
テナントの画面
コラボレーションのファイルライブラリにファイルを登録するなどして、検索対象を追加します。
IMBoxやワークフローを検索対象としている場合は、それでも可。
ジョブネットの実行
ジョブネット管理画面より「IM-ContentsSearch」の「再作成クローリング」を実施します。
これをやらないと、一生ファイルがSolrのインデックスに追加/反映されないので注意。
全文検索の実行
画面右上の方にある検索バーから検索を実行します。 「提案」というキーワードで検索を行った結果は、こんな感じになりました。
トラブルシューティング
何も検索できないんだけど?
まずは、インデックスがあるかどうかを確認する。
Solrの管理画面にある「Search」ボタンを押して少なくとも何かインデックスがあるかどうかを確認する。
q=: は全件ヒットさせるクエリ。titleがhogeのもの、というものであれば、title:hogeと書けばよい。
0件の場合はこんな結果が返される。 ジョブネットでクローリングを実施したかどうか、その結果がどうかを確認する。
<response>
<script/>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
<lst name="params">
<str name="hl.snippets">5</str>
<str name="hl.useFastVectorHighlighter">true</str>
<str name="echoParams">all</str>
<str name="start">0</str>
<str name="q">*:*</str>
<str name="rows">10</str>
<str name="indent">on</str>
<str name="version">2.2</str>
</lst>
</lst>
<result name="response" numFound="0" start="0"/>
</response>
Indexはあるんだけど、何もヒットしないんです
IM-ContentsSearchでは、検索クエリ内にユーザのロールや所属会社などのACL情報を付与することで、権限に応じた検索を行っているようです。
このため、権限がないので、インデックスはあるのにヒットしねー ということがあります。
Solrサーバに投げられた検索クエリをもとに推測します。
docker logs <Solrコンテナ>
例えば、「提案」という言葉で検索したとすると、こんなログが出ます。
params以下に着目します。
sids_allowedというフィールドに対してフィルタクエリーを発行しているため、fq=(sids_allowed:・・・) で指定されている部分を削っても、検索結果が得られないかどうかをみます。
http://:8983/solr/default/select/?paramsの内容
これで検索結果が得られるのであれば、権限がない。これでも得られない場合は、検索キーワードに合致するインデックスがない、ということになると思います。
それでも・・・
やっぱり最新のものが使いたい、という思いもあるので、Solr6.1に置き換えるのも検討中。
managed-schemaとsolrConfig.xmlの変更で行けそうな予感。