intra-mart IM-ContentsSearch用SolrをDockerでたてよう

# 概要

intra-martのIM-ContentsSearchを利用するにあたり、Apache Solrを入れろとあります。
これをdockerでやろうというものです。

# まずはDockerHubでベースイメージを探す


intra-mart Accel Platform 2016 Spring (Maxima) リリースノートの、[5.1.2.2. Apache Solr システム要件](http://www.intra-mart.jp/document/library/iap/public/iap_release_note/texts/support_environment/solr.html)には、次のように記述されています。


> 5.1.2.2.1. サポートバージョン
>   Apache Solr 3.6.x

このバージョンを求めて、[オフィシャルイメージ](https://hub.docker.com/_/solr/)を探します。

![https   hub.docker.com _ solr .png](https://qiita-image-store.s3.amazonaws.com/0/111676/bab5aac6-1108-7248-e4b0-cbdd9510223e.png)

欲しいバージョンが**古すぎ**なのか、ありません。

intra-mart用のcassandraを立てたときにも同じように古すぎてない、というのを経験したので、慣れっこです。

早く開発本部の中の人とか、本家の人が公開すると良いと思います。


# 公式の手順に従う

[セットアップガイド](http://www.intra-mart.jp/document/library/iap/public/im_contents_search/solr_administrator_guide/texts/setup/index.html)によると、セットアップツールを使うと、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（開発向け）](http://www.intra-mart.jp/document/library/iap/public/im_contents_search/solr_administrator_guide/texts/setup/index.html#common-jetty)のサーバ起動方法には、以下のようにあります。

> Linuxの場合
> /usr/local/solr/setup.sh jetty.start

ただ、上のDockerfileでこれをやりますと、こんなエラーになりました。

> /usr/local/solr/setup.sh: line 6: build/lib/ant/bin/ant: not found

![1.png](https://qiita-image-store.s3.amazonaws.com/0/111676/4955eca6-3241-e883-382d-550573fed4d7.png)

相対パスでやると、動くようです。不思議。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/5de26e7b-33a7-72dd-1f2f-0f91be232441.png)

# Solrの起動確認

```
http://<ホスト>:8983/solr/default/admin/
```
にアクセスし、Solrの管理画面が開けることを確認する。

![Solr admin page.png](https://qiita-image-store.s3.amazonaws.com/0/111676/27da1048-b47f-da51-65a2-24d09e1b4a79.png)


# intra-mart側の設定

## システム管理者の画面

### Solr接続設定

「システム環境構築」の画面から「Solr接続設定」を開き、「新規作成」を行う。

検索/索引サーバで指定する値は、先ほどSolrの起動確認画面で開いた管理画面のURLからadminを抜いたもの、と思っておけばよさげ。

|設定値|値|備考|
|:----|--:|---:|
|接続名| solr-docker | 任意の値|
|検索サーバ| http://<ホスト>:8983/solr/default|既定のコア名がdefaultなので|
|索引サーバ| http://<ホスト>:8983/solr/default|既定のコア名がdefaultなので|

「テスト接続」を押下して、接続できることを確認します。

接続が成功していると、Solrサーバ側にログが落ちるので、これを確認できます。

```shell-session
docker logs <Solrコンテナ名>
```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/111676/682bff66-f496-9489-0270-04ffcdea8c7a.png)


### テナントSolr接続設定

「システム環境構築」で設定したSolrサーバを、テナントに対して割り当てます。

割り当てないと、テナントに対して検索サーバがない、ということになり、検索時にエラーとなります。

![テナント管理.png](https://qiita-image-store.s3.amazonaws.com/0/111676/13e881c0-8437-5da0-7ade-eb6c7edc5349.png)

## テナントの画面

コラボレーションのファイルライブラリにファイルを登録するなどして、検索対象を追加します。

IMBoxやワークフローを検索対象としている場合は、それでも可。

## ジョブネットの実行

ジョブネット管理画面より「IM-ContentsSearch」の「再作成クローリング」を実施します。

これをやらないと、一生ファイルがSolrのインデックスに追加/反映されないので注意。

![ジョブネット管理.png](https://qiita-image-store.s3.amazonaws.com/0/111676/b24384b3-922f-1d19-074e-84848d5d7bd3.png)


## 全文検索の実行

画面右上の方にある検索バーから検索を実行します。　「提案」というキーワードで検索を行った結果は、こんな感じになりました。

![全文検索.png](https://qiita-image-store.s3.amazonaws.com/0/111676/02a682a4-234d-c88a-5a11-8abe1e0c6bbf.png)


# トラブルシューティング

## 何も検索できないんだけど？

まずは、インデックスがあるかどうかを確認する。

Solrの管理画面にある「Search」ボタンを押して少なくとも何かインデックスがあるかどうかを確認する。

q=*:* は全件ヒットさせるクエリ。titleがhogeのもの、というものであれば、title:hogeと書けばよい。

0件の場合はこんな結果が返される。　ジョブネットでクローリングを実施したかどうか、その結果がどうかを確認する。

```xml
<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コンテナ>
```

例えば、「提案」という言葉で検索したとすると、こんなログが出ます。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/111676/87b1eaa2-b177-8638-2d79-8cce5c169c83.png)

params以下に着目します。

**sids_allowed**というフィールドに対してフィルタクエリーを発行しているため、fq=(sids_allowed:・・・)　で指定されている部分を削っても、検索結果が得られないかどうかをみます。

> http://<Solrサーバ>:8983/solr/default/select/?paramsの内容


これで検索結果が得られるのであれば、権限がない。これでも得られない場合は、検索キーワードに合致するインデックスがない、ということになると思います。

# それでも・・・

やっぱり最新のものが使いたい、という思いもあるので、Solr6.1に置き換えるのも検討中。

managed-schemaとsolrConfig.xmlの変更で行けそうな予感。