ひ孫

犬のこととか書いていきたい

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}">

なんてことにも使えると思う。あんまり使うケースが想定できないけど。