Apache Solr Quick Start with Docker

## 概要
Apache Solrを触ってみる。Dockerで環境を作る。

## ダウンロードサイト
ここからSolrをダウンロードできる。
https://lucene.apache.org/solr/downloads.html

## Requirements
- OpenJDK 14.0.1 

## Dockerで環境構築

```Dockerfile
From openjdk:14.0.1

ARG SOLR_VER=8.5.1
ENV PATH $PATH:/usr/local/src/solr-${SOLR_VER}/bin

WORKDIR /usr/local/src
RUN curl -OL http://ftp.meisei-u.ac.jp/mirror/apache/dist/lucene/solr/${SOLR_VER}/solr-${SOLR_VER}.tgz
RUN tar zxvf solr-${SOLR_VER}.tgz

RUN yum install -y procps

WORKDIR /usr/local/src/solr-${SOLR_VER}
ENTRYPOINT ["solr", "start", "-f", "-force"]
```

### build

```shell-session
$ sudo docker build -t solr ./
```

### run

```shell-session
$ sudo docker run --rm -p 8983:8983 --name solr -it solr
```

## WEB UI
画面が見れることを確認
http://localhost:8983/solr/
![Screen Shot 2020-05-14 at 12.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/a9832153-b0dc-8e66-3adc-30e7c1fe0cf6.png)


## 起動、停止コマンド
### start
rootで起動する場合はforceが必要

```shell-session
./bin/solr start -force
```

### stop 
8983portを使用しているものを停止

```shell-session
./bin/solr stop -p 8983
```

全て停止

```shell-session
./bin/solr stop -all -force
```

## Log
ログは以下に出力される。
/usr/local/src/solr-8.5.1/server/logs/solr-8983-console.log

## SolrCloud(example)モード
SolrCloudモードで立ち上げる場合は、起動コマンドに`-e cloud`オプションを付ける。
SolrCloudとは、HA構成のモードであり、2つのそれぞれ異なるポートでnodeが2つ作られる。(defaultではnode1が8983, node2が7574)

ただし、このモードでは`-f`でforegroundでの起動をサポートしていないため、DockerfileからENTRYPOINTの行を削除してbuldし、以下の手順で起動する。

### コンテナに入る

```shell-session
$ sudo docker run --rm -p 8983:8983 -p 7574:7574 --name solr -it solr /bin/bash
```

### 起動
色々promptが出るが、、全て空白でEnterを押してdefault値でOK。

```
$ cd /usr/local/src/solr-${SOLR_VER}/bin
$ ./solr start -e cloud -force

Welcome to the SolrCloud example!
```

### WEB UI
以下2つのportで閲覧可能。

- node1: http://localhost:8983/solr/
- node2: http://localhost:7574/solr/

### Log
SolrCloudのログは以下に出力される。

- /usr/local/src/solr-8.5.1/example/cloud/node1/logs
- /usr/local/src/solr-8.5.1/example/cloud/node2/logs

## exampleデータを登録
defaultでデータセットが用意されているので登録してみる。

```shell-session
$ cd /usr/local/src/solr-8.5.1/example/exampledocs/
```

xml, json, csv全てをpostする。

```shell-session
$ post -c gettingstarted *.xml
$ post -c gettingstarted *.json
$ post -c gettingstarted *.csv
```

### 登録されたデータを確認
以下で検索できる。

```shell-session
$ curl "http://localhost:8983/solr/gettingstarted/select?q=*%3A*&wt=json&indent=true"
```

postしたデータが確認できる。

```json
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":126,
    "params":{
      "q":"*:*",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":48,"start":0,"maxScore":1.0,"docs":[
      {
        "id":"SP2514N",
        "name":["Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133"],
        "manu":["Samsung Electronics Co. Ltd."],
        "manu_id_s":"samsung",
        "cat":["electronics",
          "hard drive"],
        "features":["7200RPM, 8MB cache, IDE Ultra ATA-133",
          "NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor"],
        "price":[92.0],
        "popularity":[6],
        "inStock":[true],
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "store":["35.0752,-97.032"],
        "_version_":1666641399393550336},
      {
        "id":"6H500F0",
        "name":["Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300"],
        "manu":["Maxtor Corp."],
        "manu_id_s":"maxtor",
        "cat":["electronics",
          "hard drive"],
        "features":["SATA 3.0Gb/s, NCQ",
          "8.5ms seek",
          "16MB cache"],
        "price":[350.0],
        "popularity":[6],
        "inStock":[true],
        "store":["45.17614,-93.87341"],
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "_version_":1666641399397744640},
      {
        "id":"F8V7067-APL-KIT",
        "name":["Belkin Mobile Power Cord for iPod w/ Dock"],
        "manu":["Belkin"],
        "manu_id_s":"belkin",
        "cat":["electronics",
          "connector"],
        "features":["car power adapter, white"],
        "weight":[4.0],
        "price":[19.95],
        "popularity":[1],
        "inStock":[false],
        "store":["45.18014,-93.87741"],
        "manufacturedate_dt":"2005-08-01T16:30:25Z",
        "_version_":1666641399414521856},
      {
        "id":"apple",
        "compName_s":"Apple",
        "address_s":"1 Infinite Way, Cupertino CA",
        "_version_":1666641399451222016},
      {
        "id":"ati",
        "compName_s":"ATI Technologies",
        "address_s":"33 Commerce Valley Drive East Thornhill, ON L3T 7N6 Canada",
        "_version_":1666641399453319168},
      {
        "id":"canon",
        "compName_s":"Canon, Inc.",
        "address_s":"One Canon Plaza Lake Success, NY 11042",
        "_version_":1666641399455416320},
      {
        "id":"corsair",
        "compName_s":"Corsair Microsystems",
        "address_s":"46221 Landing Parkway Fremont, CA 94538",
        "_version_":1666641399456464896},
      {
        "id":"dell",
        "compName_s":"Dell, Inc.",
        "address_s":"One Dell Way Round Rock, Texas 78682",
        "_version_":1666641399457513472},
      {
        "id":"samsung",
        "compName_s":"Samsung Electronics Co. Ltd.",
        "address_s":"105 Challenger Rd. Ridgefield Park, NJ 07660-0511",
        "_version_":1666641399458562048},
      {
        "id":"viewsonic",
        "compName_s":"ViewSonic Corp",
        "address_s":"381 Brea Canyon Road Walnut, CA 91789-0708",
        "_version_":1666641399459610624}]
  }}
```

WEB UIでも検索できる
![Screen Shot 2020-05-14 at 14.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/25488432-0429-8d2c-3014-fafdffa5b3dc.png)



## 参考
- [Solr Tutorial](https://lucene.apache.org/solr/guide/8_5/solr-tutorial.html)
- [検索エンジンの常識をApache Solrで身につける](https://www.atmarkit.co.jp/ait/articles/1111/18/news148.html)
- [RunningSolr-StarttheServer](https://lucene.apache.org/solr/guide/6_6/running-solr.html#RunningSolr-StarttheServer)
- [Solr Quick Start](https://lucene.apache.org/solr/6_0_0/quickstart.html)