Apache Solrを使う
Apache Solrを使ってなにかを作っていきます。 データの取得〜処理〜インデックス化を手始めにやっていきます。
github
コード自体を記事内に貼ってるけど、githubに全部おいてあります。
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です。
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
インデックス用データの作成
東京都のコロナの日別感染者数データを使います。
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'
ざっくりとSolrの起動〜インデックスの作成までやりました。 基本的には
- 検索データの作成
- データに合わせたスキーマを作る
- インデックスにアップロード
のような流れです。 次は Bananaを使っていこうと思います。