Apache Solr
ご存知、全文検索システムです。これをDocker
で起動します。
Solr を Docker で起動する
Solr
の全部入りイメージがありますのでそれを利用しましょう。
$ sudo docker pull solr
あとはdocker run
すれば起動します。ポート番号は12345
にしました。また、-v
オプションを使ってコアファイルを共有しています。
$ sudo docker run --name my_solr -d -p 12345:8983 -v /opt/solr/cores:/opt/solr/server/solr/mycores -t solr
データを流し込む
起動したSolr
はデータがありませんので、データを投入します。JSON
、XML
、CSV
などで投入できますが、ここではCSV
を用います。
データ流し込みのための準備
データを流し込むためには最低限、以下の準備が必要です。順に説明します。
- 「コア」を作る
- 流し込むデータの定義をする(「スキーマ」を定義する)
「コア」を作る
「コア」とは、「プロジェクト」とか「インスタンス」とか、そういう一番大きな単位(入れ物)と考えればよいと思います。これがないことには始まりません。
まずはSolr
のコンテナの中に入ります。
$ sudo docker exec -it amiami_solr bash
「コア」を作るには二つの手続きが必要で、「『コア』用のファイルを用意する」ことと「Solr
に『コア』を登録する」ことです。core_name
と命名した「コア」を作ります。まずは前者です*1。
$ cp -R /opt/solr/server/solr/configsets/basic_configs /opt/solr/server/solr/mycores/core_name
そしてSolr
に「コア」を登録します。
$ solr create_core -c core_name -d basic_configs
「コア」を作ることができました。
流し込むデータを定義する
次に流し込むデータを定義します。「スキーマ」を定義するともいいます。データベースにおけるカラムの定義のような感じです。定義はJSON
で書き、それをcurl
を用いて API 経由で送ります。
JSON
は以下のように書きます。
{ "add-field" : { "name" : "fullname", "type" : "text_ja" }, "add-field" : { "name" : "age", "type" : "strings" }, "add-field" : { "name" : "gender", "type" : "strings" } }
"add-field"
キーが一つのカラムを追加するという意味です。"name"
は「カラム名」、"type"
が「型」と考えればよいでしょう。
"type"
には様々なものがあり、自分で定義することもできる(フィールド定義)のですが、ここでは既存のものを用います。簡単に言えば、"text_ja"
は「日本語の自然言語」、"strings"
は「数字や固定文字列」です*2。
前者は形態素解析により語句が分解されて検索対象となりますが、後者は分解されずにそのままの語句がデータとして登録されます。
さて、JSON
でデータを定義できたらその内容を送り込みましょう。以下のようにコマンドを叩きます。
$ curl -X POST -H 'Content-type:application/json' --data-binary ' { "add-field" : { "name" : "fullname", "type" : "text_ja" }, "add-field" : { "name" : "age", "type" : "strings" }, "add-field" : { "name" : "gender", "type" : "strings" } }' http://localhost:12345/solr/core_name/schema
以下のような結果が返ってくれば成功です。
{ "responseHeader":{ "status":0, "QTime":412 } }
データを実際に送り込む
やっと準備が終わりました。ここまではデータベースではテーブル作成にあたるところでしょうか。
送り込むためのCSV
ファイルを作りましょう。以下のような形になればよいです。ファイル名はmy_solr_data.csv
としましょう。
fullname,age,gender "k_tanaka","21","male" "o_suzuki","25","female" "t_yamada","22","male"
一行目がヘッダであり、区切りはカンマ、個別のデータの区切りはダブルクォートという仕様です*3。CSV
ファイルができたならばコマンドで送り込みます。
$ post -c core_name -type text/csv my_solr_data.csv ... COMMITting Solr index changes to http://localhost:12345/solr/core_name/update... Time spent: 0:00:02.198 $
上記のようなレスポンスになれば成功です。
管理画面で確認する
ウェブの管理画面に行って確認してみましょう。アドレスはhttp://192.168.160.199:20000/solr/#/
です。
Core Selector
でcore_name
を選択し、Query
で検索画面に行きます。検索画面のcommon
の中のq
というところが検索語句を入れるところで、書式はコロン区切りで[フィールド名]:[検索語句]
です。たとえばgender
がmale
の人を検索したかったら、gender:male
で検索します。
AND
検索や絞り込み検索など具体的な検索手法については他に譲ることにします。