こんにちは。CData Software Japan リードエンジニアの杉本です。
今日はオープンソースの全文検索エンジンである Apache Solr に CData JDBC Driver 経由でデータを取り込む方法を紹介したいと思います。
Apache Solr とは?
Apache Solr(アパッチソーラー) は Apacheソフトウェア財団のLuceneプロジェクトのサブプロジェクトとして開発されているオープンソースの全文検索エンジンです。
https://lucene.apache.org/solr/
API・データストアや各種データを取り込むためのデータインポートも備えているので、手軽に独自アプリケーションに検索エンジンを組み込むことができるようになっています。
今回は Apache Solr が提供するデータインポート機能、DataImport Handler を使って、クラウドデータを取り込みます。
本記事のシナリオ
本記事では CRM・SFAクラウドサービスであるSalesforceのデータをApache Solr に取り込み、Apache Solr で検索が実施できるようにするための手順を紹介します。
通常 Apache SolrはXML・CSV・JSONといったフォーマットやPDF、Word、HTMLなどのファイル、もしくはJDBC経由でのRDB接続で取得したデータのみを検索の対象としています。
https://lucene.apache.org/solr/guide/8_5/post-tool.html
Apache Solrの仕組みを利用して、プログラムでデータを取得して登録することもできますが、様々なAPIへの連携実装や保守・メンテナンスのコストが多くかかってしまいます。
そこで本記事ではApache Solrがもともと備えているJDBCのインターフェースを利用することでこのボトルネックを解消します。
CData Software Japan では SalesforceやKintone、JIRAなどに接続することができる各種JDBC Driverを200種類ほど提供しています。
https://www.cdata.com/jp/jdbc/#drivers
この各種JDBC Driverを用いることで、各APIの仕様を意識せず DataImport を実行でき、Apache Solr のエンジンでクラウドデータを検索することができるようになります。
手順
必要なもの
- Apache Solr 本体(今回はVersion 8.5.2を使用)
- CData Salesforce JDBC Driver
- Salesforce アカウント(トライアルの取得方法はこちらを参照)
Apache Solr のインストール
まず Apache Solr を入手してきます。今回はWindows 上で実行しましたので、以下のURLからZIPになっているものを取得しています。
https://lucene.apache.org/solr/downloads.html
Apache Solr の開始・コアの生成
ZIPファイルを解凍後、binフォルダに移動して、Apache Solr を起動します。なお、今回は検証用途のためスタンドアロンで構成しています。
> cd solr-8.5.2\bin > solr start
そして検証用となるコアを一つ追加しました。
> solr create -c CDataCore
以下のURLで作成したCoreにアクセスできます。
http://localhost:8983/solr/#/CDataCore/core-overview
続いて取り込み先となるShemaを定義しておきます。
今回はSalesforceのいくつかの項目と合わせて、以下のフィールドを追加しました。
<field name="CreatedDate" type="pdate" uninvertible="true" indexed="true" stored="true"/> <field name="Description" type="string" uninvertible="true" indexed="true" stored="true"/> <field name="Fax" type="string" uninvertible="true" indexed="true" stored="true"/> <field name="LastModifiedDate" type="pdate" uninvertible="true" indexed="true" stored="true"/> <field name="Name" type="string" uninvertible="true" indexed="true" stored="true"/> <field name="Phone" type="string" uninvertible="true" indexed="true" stored="true"/> <field name="Website" type="string" uninvertible="true" indexed="true" stored="true"/>
Salesforce JDBC Driver のインストール
続いて、CData Salesforce JDBC Driver をインストールします。トライアルは以下のURLから入手できます。
https://www.cdata.com/jp/drivers/salesforce/jdbc/
ダウンロード後、exeファイルを実行し、セットアップを進めます。
JDBC Driver を Solr のlibフォルダに配置
CData Salesforce JDBC Driver のインストールが完了すると、以下のフォルダにJDBC Driverの本体であるjarファイルが生成されます。
C:\Program Files\CData\CData JDBC Driver for Salesforce 2019J\lib
この「cdata.jdbc.salesforce.jar」ファイルとライセンスファイルである「cdata.jdbc.salesforce.lic」をApache Solrの以下のフォルダに配置します。
- solr-8.5.2\server\lib
DIH(DataImport Handler)の定義を追加する
それではデータ処理を担う機能であるDIH(DataImport Handler)の定義を追加しましょう。
まず作成したCoreに含まれるConfigファイを編集します。
DIH実行に必要なjarファイルの参照を追加し、DIHのRequestHandler定義を追加します。
DIHの設定ファイルは「solr-data-config.xml」としました。
<!-- solr-8.5.2\server\solr\CDataCore\conf\solrconfig.xml --> <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" /> <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">solr-data-config.xml</str> </lst> </requestHandler>
続いて同じ階層に「solr-data-config.xml」を作成します。
今回はSalesforceから取引先の情報であるAccountテーブルを取り込む定義を作成してみました。
DriverのClassおよび接続URLはこちらを参考にしてみてください。
<!-- solr-8.5.2\server\solr\CDataCore\conf\solr-data-config.xml --> <dataConfig> <dataSource driver="cdata.jdbc.salesforce.SalesforceDriver" url="jdbc:salesforce:User=XXXX;Password=XXXX;Security Token=XXXXX;"/> <document> <entity name="Account" query="SELECT Id,Name,Phone,Fax,Website,Description,CreatedDate,LastModifiedDate FROM Account" deltaQuery="SELECT Id FROM Account where LastModifiedDate >= '${dataimporter.last_index_time}'" deltaImportQuery="SELECT Id,Name,Phone,Fax,Website,Description,CreatedDate,LastModifiedDate FROM Account where Id=${dataimporter.delta.Id}"> <field column="Id" name="Id" /> <field column="Name" name="Name" /> <field column="Phone" name="Phone" /> <field column="Fax" name="Fax" /> <field column="Website" name="Website" /> <field column="Description" name="Description" /> <field column="CreatedDate" name="CreatedDate" /> <field column="LastModifiedDate" name="LastModifiedDate" /> </entity> </document> </dataConfig>
queryでデータを取得するためのSQL文を定義しています。データモデルはこちらが参考になります。
deltaQuery・deltaImportQueryは差分更新時の条件と上書きインポート時のID識別を定義しています。
設定完了後、一度Solrを再起動します。
> solr stop -all > solr start
DataImport の実行(全件登録:Full-Import)
再起動後、以下のURLからDataImportを実行できます。
http://localhost:8983/solr/#/CDataCore/dataimport//dataimport
まず「full-import」、Entityから「Account」を選択して、「Execute」してみます。
登録された結果を「Query」画面から見てみると、各スキーマにデータが取り込まれていることが確認できました。
以下のSalesforceのデータが正常に取り込まれているのがわかります。
DataImport の実行(差分更新:Delta-Import)
次に差分更新であるDeltaQueryも試してみましょう。以下のレコードを書き換えてみます。
DataImportの画面から今度は「Delta-Import」を選択して、Executeを押してみます。
正常に取り込みが完了すると、以下のようにレコードが更新されていることが確認できました。
おわりに
とても手軽に Apache Solr へ Salesforce のデータ取り込むことができました。
CData では Salesforce 以外にも数多くの JDBC Driver を提供しています。
kintone や Sansan といった日本のクラウドサービスや JIRA、Gmail などKBやナレッジが非定形で蓄積されているようなデータソースにも対応しているので、エンタープライズ検索のデータとして活用できるのではないかなと思います。
https://www.cdata.com/jp/jdbc/
すべて30日間のトライアルがあるので、是非一度試してみてください。