参考:http://www.rondhuit.com/scriptupdateprocessor.html
記事はjavascriptの場合についてですが、
ここはjythonを使用しPythonによるフィールド登録のやり方をご紹介します。
ちなみに、環境はCentOS7でSolr6とManifoldCF2.4のバージョンを使用しています。
1.solrconfig.xmlにupdateRequestProcessorChainを追加
...
<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を指定
...
<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文と接続の記述例
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スクリプトが正しく動かない場合は、多少面倒ですが、エラーログをみながら試行錯誤する必要があるかもしれません。