LoginSignup
2
2

More than 5 years have passed since last update.

SolrのScriptUpdateProcessorを利用し、Pythonでインデックスの前処理をする

Last updated at Posted at 2016-10-14

参考:http://www.rondhuit.com/scriptupdateprocessor.html

記事はjavascriptの場合についてですが、
ここはjythonを使用しPythonによるフィールド登録のやり方をご紹介します。
ちなみに、環境はCentOS7でSolr6とManifoldCF2.4のバージョンを使用しています。

1.solrconfig.xmlにupdateRequestProcessorChainを追加

solrconfig.xml
...
<updateRequestProcessorChain name="script">
  <processor class="solr.StatelessScriptUpdateProcessorFactory">
    <str name="script">update-script.py</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
...

solrconfig.xmlはsolr5以降以下の場所に配置されているようです。
var/solr/data/<corename>/conf/solrconfig.xml

2.requestHandlerに上記定義したUpdateChainを指定

solrconfig.xml
...
<requestHandler name="/update" class="solr.UpdateRequestHandler">    
  <lst name="defaults">
    <str name="update.chain">script</str>
  </lst>       
</requestHandler>
...

ManifoldCFでPDFやExcelをクロールする前提であれば、ExtractingRequestHandlerに、
RDBをクロールする場合は、DataImportHanlderに上記記述をそれぞれ追加する必要があります。

3.update-script.pyのpython scriptを配置
配置先:
var/solr/data/<corename>/conf/update-script.py

Pythonでfieldを登録するには
doc.setField("field_name","field_value")
と書きます。scriptによる登録するfield_nameはあらかじめ「managed_schema.xml」に追加する必要があります。
同じ名前の登録があれば、solr側でマッピングしてくれます。
ちなみにすでに投入したインデックスを
doc.getFieldValue("field_name")
で取得できます。
スクリプトは実行されるたびに評価されるので、編集によってSolrを再起動する必要がありません。

4.Jythonをインストール
JavaVM上でpythonを動かすため、jythonを使います。下記リンクから入手

Installer版ではなく、Standalone版が必要らしい。こんな具合でSolr側に置きます。

var/solr/data/<corename>/lib/jython-standalone-2.X.X.jar

5.DBと連携する場合
postgresDBからデータを取得する必要があったので、pythonからDBにアクセスためのJDBCが必要です。

https://jdbc.postgresql.org/download.html からJDKとpostegresバージョンそれぞれマッチしたJDBCを入手し

var/solr/data/<corename>/lib/postgresql-9.X-XXXX.jarに配置

import文と接続の記述例

update.script
from com.ziclix.python.sql import zxJDBC

DB_URL = "jdbc:postgresql://yourpostgreshost:port/dbname"
DB_USER = "postgres"
DB_PASS = "password"
DB_DRIVER = "org.postgresql.Driver"
connection = zxJDBC.connect(DB_URL, DB_USER, DB_PASS, DB_DRIVER)

のように配置します。

6.外部ライブラリを参照する場合

もし外部のライブラリをimportする場合、jython standalone版のjarを解凍し、
外部ライブラリ適切な場所(通常は/Lib)に配置した状態で再度jarにすればOK。もっといい方法があるかもしれませんが。。。

これで完了です。Manifoldcfでジョブを実行して確かめてください。Pythonスクリプトが正しく動かない場合は、多少面倒ですが、エラーログをみながら試行錯誤する必要があるかもしれません。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2