SolrのDataImportHandler例を動作させる



SolrにはDataImportHandlerという機能があり、これは「いちいちクライアント側(この場合はSolrを利用する側のプログラム)で、個別のインデックス登録を指示しなくとも、Solrが勝手にRDBに接続して勝手に登録してくれる」という夢のような機能である。

もちろん、そうはうまく行かないであろうことは想像がつくが、しかし、利用プログラム側で登録動作をしなくて良い点は楽かと思う。こちらは単純に、従来のRDB登録とSolrでの検索のみを行えば良いのだ。

もちろん、これまでにわかっていることは、

  • Solr側の設定としてRDB接続アカウントを指定してやる必要がある。
  • RDBからデータを拾い出すSQLを指定してやる必要がある。
  • 特に更新(DeltaImportと呼ばれるらしい)をサポートするためには、テーブルのフィールドとして更新日時timestampが必要らしい。

ともあれ、Solrにあらかじめ組み込まれているDataImportHandlerの例を動作させてみる。

結論

最初に結論だが、この機能は使いものにならない。こちらとしては、これをやりたいわけだ。

  • 最初にすべてのデータについてインデックスを作ってほしい
  • それ以降については、追加や更新されたものについてインデックスを作って欲しい

のだが、これを行わせるためには、

  • おそらくその起動を指示しなければならない
  • 追加・更新時の処理としては、タイムスタンプを見て行う。つまり、その都度すべてのレコードがスキャンされる

ということだ。したがって「定期的に」行わせることになるのだが、その間隔をどの程度にするかが問題になる。

  • やりすぎても無駄になるし、やらなすぎると検索に反映されなくなる

ということになる。したがって、この機能に頼らず、「何らかの追加・更新・削除があった場合には、それを独自に記録しておき、その記録レコードが存在すれば、ただちにインデックスのメンテナンスをする」という方針の方が明らかに有利である。

したがって、この機能を使う必要はない。

solr.solr.home

Solrのフォルダ構造で見たように、通常の動作としてはSolrはインストールディレクトリ下のserver/solrフォルダをコア格納フォルダとする(正式には何と呼ばれるのかわからないが)。これはsolr.solr.homeと呼ばれるらしい。

いわば、server/solrの中に複数のインデックスデータベースがあるイメージである。その上のserver直下のフォルダには、logsのようにログを格納するフォルダがある。

solr.solr.homeフォルダはどの場所でも良いようだ。これは、solrコマンドの-s引数で変更できる。

example-DIH

さて、example/example-DIH/solrにDataImportHandlerの例があるのだが、このフォルダ自体がコア格納フォルダ。このため、solr.solr.homeフォルダとしてこの場所を指定すればsolrはこれをコアフォルダとして認識して動作する。

つまり、今solrのインストールが「c:\solr」だとすると、このフォルダは「C:\solr\example\example-DIH\solr」になっている。したがって、ここをsolr.solr.homeに指定してSolrを起動するには、

solr start -s C:\solr\example\example-DIH\solr

とすればよい。Solrはデフォルトの場所を綺麗サッパリ忘れ、このサンプルの場所を相手にするようになる。

ただし、同じことをもっと簡単なコマンドで行うことができる。このバッチファイル(シェルスクリプト)には、あらかじめサンプルの場所の知識があるようで、以下でもよい。

solr -e dih

ともあれ、この状態でlocalhost:8983を見てみると、このサンプル内に用意されたコア(のみ)が表示される。

これはもちろん、example-DIH/solr下のフォルダに一致している。

DataImportHandlerの設定ファイル

上記のコアのそれぞれがDataImportHandlerの例なのだが、その設定としては、以下のようである。

それぞれのコアフォルダのconfフォルダにはsolrconfig.xmlという設定ファイルがある。これは、そのコアの個別の設定を記述するファイルらしい。ここに、data import handler関連の設定ファイルの名称を記述してやる。

例えば、atom/conf/solrconfig.xmlの場合だと。

  <requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">atom-data-config.xml</str>
      <str name="processor">trim_text</str>
    </lst>
  </requestHandler>

との記述があり、同じフォルダのatom-data-config.xmlには、何やらStackOverflowのatomフィードを取得する定義があるようだ。

atomフィードの取得例

このatomフィードのData Import Handlerを動作させてみる。まずはQueryでほぼ何も無いことを確認する。何の条件も指定せずに単にExecute Queryをクリックするだけだ。

次にDataImportのExecuteをクリックする。右上にindexingという表示が現れる。

このとき、atomフォルダ下のindexフォルダを見てみると、Luceneのインデックスが形成されていることがわかる。

インデックスづけが終了すると、こんなメッセージになる。対象は30個のみだったようだ。どういう条件で取得したのかわからないのだが。

最初と同じく条件を指定せずにQueryを実行すると、今度はいくばくかのドキュメントが出てくる。

この例でわかることとしては、データを引っ張ってくるのは特にRDBに限らないということだ。ここでは、ウェブサイトのatomフィードを取得している。

dbの例

こちらは、Dbからデータ取得する例のようだが、操作としてはatomの場合と同じだ。単純にDataImportを行うとインデックスが作成され、検索が行えるというものだ。

問題は設定ファイルの構造である。以下に詳細が記述されている。

これについては次回見ていく。