Apahce Solr 101

Apache Solrを使う

Apache Solrを使ってなにかを作っていきます。 データの取得〜処理〜インデックス化を手始めにやっていきます。

github

コード自体を記事内に貼ってるけど、githubに全部おいてあります。

connvoi/learn-solr

Solrの起動

docker-composeを使ってローカルのmacにSolrのインデックスを作っていきます。 適当なディレクトリにdocker-compose.ymlを作成します。

version: '3'
services:
  solr:
    image: solr:8
    ports:
      - "8983:8983"
    volumes:
      - './data:/var/solr/data'

同じディレクトリにdataを作成し、docker-comoposeを起動します。

mkdir data
docker-compose up -d

Solrの動作確認

docker-composeで起動したあとに、http://localhost:8983にアクセスするとSolrが起動していることが確認できます。 以下のようになっていればOKです。

スクリーンショット 2020-07-01 23.45.38
Solrの画面

Solrのコアを作成する

solrコマンドを使い検索インデックス用のコアを作成します。 docker-compose upをしたディレクトリから、execしdocker内に入り、solrコマンドを叩きます

$ docker-compose exec solr /bin/bash
solr@d01f69ddcaaf:/opt/solr-8.5.2$ solr create -c covid
スクリーンショット 2020-07-02 18.24.31
コアができるとCore Adminに表示される

インデックス用データの作成

東京都のコロナの日別感染者数データを使います。

tokyo-metropolitan-gov/covid19

jsonファイルをダウンロードし、solrに投げれるように加工します。 もともとのjsonファイルからインデックスに必要な部分だけを抜き出して、再度jsonにして保存します。 githubにあるcreatedata.pyを実行すると、インデックス用のジェイソンが表示されるので、それをdata/solr_feed.jsonに保存。

#scripts/createdata.py

import json 

with open('../data/daily_positive_detail.json') as f:
    d = json.load(f)

result=[]

for i in d['data']:
    result.append(json.dumps(i))

json_data = '['
json_data += ','.join(result)
json_data += ']'

print(json_data)

出来上がるとこんな感じになります。

[{"diagnosed_date": "2020-01-20", "count": 0, "missing_count": null, "reported_count": null, "weekly_gain_ratio": null, "untracked_percent": null, "weekly_average_count": null},
{"diagnosed_date": "2020-01-21", "count": 0, "missing_count": null, "reported_count": null, "weekly_gain_ratio": null, "untracked_percent": null, "weekly_average_count": null},

...

schemaの設定

Schema APIを使ってインデックス用のフィールドを作っていきます。 solr_feed.jsonの中身と項目名を揃えてフィールドを作ります。

#scripts/addfields.sh
curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field":{
     "name":"diagnosed_date",
     "type":"string",
     "stored":true },
  "add-field":{
     "name":"count",
     "type":"pint",
     "stored":true },
  "add-field":{
     "name":"missing_count",
     "type":"pint",
     "stored":true },
  "add-field":{
     "name":"weekly_average_count",
     "type":"pint",
     "stored":true },
  "add-field":{
     "name":"reported_count",
     "type":"pint",
     "stored":true },
  "add-field":{
     "name":"untracked_percent",
     "type":"pfloat",
     "stored":true },
  "add-field":{
     "name":"weekly_gain_ratio",
     "type":"pfloat",
     "stored":true }
}' http://localhost:8983/solr/covid/schema

インデクスへファイルを送信

作成したsolr_feed.jsonをインデックスに送信して、solrの画面から参照できるようになれば完了です。

#solrへデータを送信する
#scripts/update.sh
#!/bin/sh
curl 'http://localhost:8983/solr/covid/update?commit=true' --data-binary @../data/solr_feed.json -H 'Content-type:application/json'
スクリーンショット 2020-07-02 19.15.43
2020-06の検索画面

ざっくりとSolrの起動〜インデックスの作成までやりました。 基本的には

  1. 検索データの作成
  2. データに合わせたスキーマを作る
  3. インデックスにアップロード

のような流れです。 次は Bananaを使っていこうと思います。

connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

Jp, Tokyo https://connvoi.com