DataImportHandlerにGETリクエストから変数を与える
Solrでデータを入れるときに使うDataImportHandler
例えばDBなんかを叩いてその結果をSolr内に格納したりできる。
サンプルとしては下記のような感じ。
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>
しかしそうなるとDBのパスワードだのユーザー名とかをどこで管理する?って話しになる。
パスワードなんかはこのままコミットするわけにはいかないだろう。
ここで2つ方法がある。
1.propertyファイルを使う。
2.リクエストURLを使う
1のpropertyファイルというのはsolrcore.properiesというプロパティファイルのこと。
たとえばこれに
#solrcore.properties dataimport.user = db_user dataimport.pass = db_pass
と書いておくとDataImportHandlerのスキーマで
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="${solr.dataimport.user}" password="${solr.dataimport.pass}"/>
とすることでデータを読んでくれる。
これはこれでよいけど例えばsolrを複数台立てていたり台数を増やしたりとか言う時を考えるとちょっとだけ管理が面倒だったりする(大した手間でもないけど)
そこで活躍してくれるのが2のリクエストパラメータを使う方法。
とりあえずスキーマには
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="${dataimporter.request.user}" password="${dataimporter.request.pass}"/>
というように書き、DataimportHandlerへ同期命令をするときに下記のようなURLを叩く
curl http://localhost:8983/solr/dataimport?command=delta-import&pass=db_pass&user=db_user
するとDataImportHandlerは&pass=db_pass&user=db_userの部分を${dataimporter.request.hoge}を解析して使ってくれる。
ただパスワードとかをhttpでやりとりするわけなのでSolrとパスワードを保存する環境が閉じたネットワーク内だったりしない場合は1のほうが多少手間があっても安全かもしれない(正直インフラのことはよくわかっていない)。
あとリクエストパラメータとして使えるので例えばsolrごとにそれぞれインポートさせる条件を変えたいなんて場合があったとしたら
<entity name="item" query="SELECT * FROM item WHERE type=${dataimporter.request.item_type}">
なんてことにも使えると思う。あんまり使うケースが想定できないけど。