CData Software Blog

クラウド連携のCData Software の技術ブログです。

Apache Solr の Data Import Handler で Salesforce のレコードを取り込む:CData JDBC Driver

f:id:sugimomoto:20200703143330p:plain

こんにちは。CData Software Japan リードエンジニアの杉本です。

今日はオープンソース全文検索エンジンである Apache Solr に CData JDBC Driver 経由でデータを取り込む方法を紹介したいと思います。

Apache Solr とは?

Apache Solr(アパッチソーラー) は Apacheソフトウェア財団のLuceneプロジェクトのサブプロジェクトとして開発されているオープンソース全文検索エンジンです。

https://lucene.apache.org/solr/

f:id:sugimomoto:20200703142816p:plain

API・データストアや各種データを取り込むためのデータインポートも備えているので、手軽に独自アプリケーションに検索エンジンを組み込むことができるようになっています。

f:id:sugimomoto:20200703142822p:plain

今回は Apache Solr が提供するデータインポート機能、DataImport Handler を使って、クラウドデータを取り込みます。

lucene.apache.org

f:id:sugimomoto:20200703142829p:plain

本記事のシナリオ

本記事では CRMSFAクラウドサービスであるSalesforceのデータをApache Solr に取り込み、Apache Solr で検索が実施できるようにするための手順を紹介します。

通常 Apache SolrはXMLCSVJSONといったフォーマットやPDF、Word、HTMLなどのファイル、もしくはJDBC経由でのRDB接続で取得したデータのみを検索の対象としています。

https://lucene.apache.org/solr/guide/8_5/post-tool.html

f:id:sugimomoto:20200703142854p:plain

Apache Solrの仕組みを利用して、プログラムでデータを取得して登録することもできますが、様々なAPIへの連携実装や保守・メンテナンスのコストが多くかかってしまいます。

そこで本記事ではApache Solrがもともと備えているJDBCのインターフェースを利用することでこのボトルネックを解消します。

CData Software Japan では SalesforceやKintone、JIRAなどに接続することができる各種JDBC Driverを200種類ほど提供しています。

https://www.cdata.com/jp/jdbc/#drivers

f:id:sugimomoto:20200702152837p:plain

この各種JDBC Driverを用いることで、各APIの仕様を意識せず DataImport を実行でき、Apache Solr のエンジンでクラウドデータを検索することができるようになります。

f:id:sugimomoto:20200703143330p:plain

手順

必要なもの

Apache Solr のインストール

まず Apache Solr を入手してきます。今回はWindows 上で実行しましたので、以下のURLからZIPになっているものを取得しています。

https://lucene.apache.org/solr/downloads.html

f:id:sugimomoto:20200703142913p:plain

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

f:id:sugimomoto:20200703142921p:plain

Salesforce JDBC Driver のインストール

続いて、CData Salesforce JDBC Driver をインストールします。トライアルは以下のURLから入手できます。

https://www.cdata.com/jp/drivers/salesforce/jdbc/

f:id:sugimomoto:20200116122206p:plain

ダウンロード後、exeファイルを実行し、セットアップを進めます。

f:id:sugimomoto:20200116122213p:plain

JDBC Driver を Solr のlibフォルダに配置

CData Salesforce JDBC Driver のインストールが完了すると、以下のフォルダにJDBC Driverの本体であるjarファイルが生成されます。

C:\Program Files\CData\CData JDBC Driver for Salesforce 2019J\lib

f:id:sugimomoto:20200702152855p:plain

この「cdata.jdbc.salesforce.jar」ファイルとライセンスファイルである「cdata.jdbc.salesforce.lic」をApache Solrの以下のフォルダに配置します。

  • solr-8.5.2\server\lib

f:id:sugimomoto:20200702152900p:plain

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

f:id:sugimomoto:20200703142936p:plain

まず「full-import」、Entityから「Account」を選択して、「Execute」してみます。

f:id:sugimomoto:20200703142941p:plain

登録された結果を「Query」画面から見てみると、各スキーマにデータが取り込まれていることが確認できました。

f:id:sugimomoto:20200703142947p:plain

以下のSalesforceのデータが正常に取り込まれているのがわかります。

f:id:sugimomoto:20200703142953p:plain

DataImport の実行(差分更新:Delta-Import)

次に差分更新であるDeltaQueryも試してみましょう。以下のレコードを書き換えてみます。

f:id:sugimomoto:20200703143000p:plain

DataImportの画面から今度は「Delta-Import」を選択して、Executeを押してみます。

f:id:sugimomoto:20200703143005p:plain

正常に取り込みが完了すると、以下のようにレコードが更新されていることが確認できました。

f:id:sugimomoto:20200703143011p:plain

おわりに

とても手軽に Apache Solr へ Salesforce のデータ取り込むことができました。

CData では Salesforce 以外にも数多くの JDBC Driver を提供しています。

kintone や Sansan といった日本のクラウドサービスや JIRA、Gmail などKBやナレッジが非定形で蓄積されているようなデータソースにも対応しているので、エンタープライズ検索のデータとして活用できるのではないかなと思います。

https://www.cdata.com/jp/jdbc/

f:id:sugimomoto:20200116122333p:plain

すべて30日間のトライアルがあるので、是非一度試してみてください。