Docker で Apache Solr を動かす方法

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はデータがありませんので、データを投入します。JSONXMLCSVなどで投入できますが、ここでは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"

一行目がヘッダであり、区切りはカンマ、個別のデータの区切りはダブルクォートという仕様です*3CSVファイルができたならばコマンドで送り込みます。

$ 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 Selectorcore_nameを選択し、Queryで検索画面に行きます。検索画面のcommonの中のqというところが検索語句を入れるところで、書式はコロン区切りで[フィールド名]:[検索語句]です。たとえばgendermaleの人を検索したかったら、gender:maleで検索します。

AND検索や絞り込み検索など具体的な検索手法については他に譲ることにします。

参考サイト(感謝!)

参考書籍(感謝!)

*1:ここでは「basic_configs」をひな形にしていますが、他のひな形も用意されています

*2:かなり大雑把です

*3:これらはオプションで変更できます

Powered by はてなブログ