solr

　Apache Fundationが管理する全文検索エンジンである．
　Javaで書かれている．
メンテナンス時にはすでに忘れているので，自分用によく使うコマンドなどを記す．


# DockerコンテナとしてSolr環境を構築

### ラズパイの場合のdocker準備

PCの場合も同じだと思われるが，Rapsberry Pi OSの場合には，次のコマンドで準備を行っておく．

```
$ curl -sSL https://get.docker.com | sh
$ sudo apt install python3-pip
$ sudo pip3 install docker-compose
```

## dockerでSolrを導入
以降は，PCであれラズパイであれ，Linux上で行う作業は同じ．

```
$ mkdir solrdata  //データ保存用ディレクトリをホスト側に作っておく
$ sudo chown -R 8983:8983 solrdata  //オーナーを変更
$ docker run --name solr --rm -v ./solrdata:/var/solr -p 8983:8983 solr:latest &
```

`--name`
　dockerイメージを指定
　（指定したdockerイメージがホスト側に保存されていなければ，docker hubから自動でダウンロードされる）
　（ホスト側に保存されているdockerイメージの一覧は `$ docker images` コマンドで参照できる）

`-v`
　永続的にデータを保存するため，
　ホスト側の `./solrdata` ディレクトリをコンテナ側の `/var/solr` にマウントする．

### 起動したか確認
#### 方法1：ウェブブラウザで確認
　dockerコンテナが起動するとSolrのサーバが走るので，ウェブブラウザから `localhost:8983` にアクセスするとウェブアプリ（管理ツール）が表示される．

#### 方法2：コマンドで確認
　次のコマンドで現在起動中のDocker一覧が出力される．
　停止させたい場合は，コマンド `docker stop solr` を使う．

```bash
$ docker ps
```

### コンテナのシェルに入る
　次のコマンドで，solrコンテナ側のシェルに入れる．

```bash
$ docker exec -it solr /bin/bash
```


　Dockerコンテナを起動した状態で，すでにSolrが走っている．

#### Solrの停止
　停止したい場合は次のコマンドを，コンテナ側のシェルで実行する．

```bash
solr stop
```

#### Solrの起動
　次のコマンドでsolrを起動する．

```
$ solr start
```

### 環境変数
　Dockerイメージ `solr` にはSolr関係の環境変数があらかじめ設定されている．

| 環境変数 | 値 |
|-|-|
| SOLR-PID_DIR | /var/solr |
| SOLR_UID | 8983 |
| SOLR_INCLUDE | /etc/default/solr.in.sh |
| SOLR_GID | 8983 |
| SOLR_JETTY_HOST | 0.0.0.0 |
| SOLR_HOME | /var/solr/data |
| SOLR_USER | solr |
| SOLR_LOGS_DIR | /var/solr/logs |
| SOLR_GROUP | solr |


### ホスト側からコンテナ側へコマンドの送り方
`$ docker exec`
　ホスト側のコマンドラインで実行することで，コンテナ上でコマンドを実行させられる．
　（次のコマンドは，postコマンドでexampleコアにドキュメントを登録する例）
　幾つかのコマンドを実行する場合は，コンテナ側のシェルに入った方がよいが，1つのコマンドを実行するだけなら，ホスト側から この `docker exec` コマンドを使った方がよいかもしれない．

```
$ docker exec -it solr post -c example /opt/solr/example/exampledocs/books.csv
```

# コアを作る
　次のコマンドをコンテナ側のシェルで実行することで `testCore' という名称のコアを作成する．

```
$ solr create_core -c testCore
```

　ホスト側のウェブブラウザで `localhost:8983` にアクセスすると，コアができていることを確認できる．


# スキーマ定義
## フィールドタイプ
　フィールドタイプは，差し当って予め用意されたものを使うので，今回は独自の定義はしない．

## フィールド
　コンテナのシェルからSchema APIを使ってスキーマを定義する．

### 方法1：ファイルから読み込ませる
　スキーマ定義する内容を予めjsonファイルとして用意しておき，それをコマンドで読み込ませる．
　ここでは，'testCore_schema.json` というファイルを予め用意しておき，それをコマンドで読み込んでスキーマ定義を行う．

```
$ curl -X POST -H 'Content-type:application/json' --data-binary @testCore_schema.json http://localhost:8983/solr/testCore/schema
```

<style>
.sumiami{
  background-color:blue;
}
</style>
<div class="sumiami">

### 方法2：コマンドラインでスキーマ定義する
　コマンドでスキーマを定義するjsonデータを読み込ませられる．
　一例として次にコマンドを示す．

```
$ curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field" :{
    "name":"id",
    "type":"string",
    "indexed":"true",
    "stored":"true",
    "required":"ture",
    "multiValued":"false"
  },
  "add-field" :{
    "name":"chapter",
    "type":"string",
    "indexed":"true",
    "stored":"true",
    "required":"ture",
    "multiValued":"false"
  },
  "add-field" :{
    "name":"title",
    "type":"text_ja",
    "indexed":"true",
    "stored":"true",
    "required":"ture",
    "multiValued":"false"
  },
  "add-field" :{
    "name":"body",
    "type":"text_ja",
    "indexed":"true",
    "stored":"true",
    "required":"ture",
    "multiValued":"false"
  },
  "add-field" :{
    "name":"author",
    "type":"text_ja",
    "indexed":"true",
    "stored":"true",
    "required":"ture",
    "multiValued":"true"
  }
}' http://localhost:8983/solr/testCore/schema
```
</div>


# ドキュメント登録
　データを食わせてインデックスを作成する．
　jsonファイルかxmlファイルを読み込ませられる．
　Solrに付属するpostツールを使えば，PDFを含む各種ファイルも読み込ませられる．

　ここでは，SolrのREST APIを使ってjsonファイル(`add_data.json`)として用意したデータを登録する．これは，Curlコマンドを使ってHTTP経由で行う．
ホスト側（もしくはネットワークでつながったリモートホストから）で次のコマンドを実行する．

```
$ curl -X POST -H 'Content-Type:text/json' 'http://localhost:8983/solr/testCore/update/json/docs?commit=true' -d @add_data.json
```

# 検索
`/select` に次の要素を加えると様々な結果を得られる．

## 単語の出現数
その文章における対象単語の出現数

### フォーマット
```
fl=termfreq(検索対象欄, '検索対象語')
```

### 例

```
fl=termfreq(author, '手塚おさむし')
```

## Score

### フォーマット
```
fl=score
```

### 例
全ての要素と`score`をレスポンスさせる例．

```
fl=*, score
```


参考文献
（1）Apache Solr Reference Guide
https://solr.apache.org/guide/solr/latest/index.html
（2）Function Queries
https://solr.apache.org/guide/7_4/function-queries.html#termfreq-function