FessでSalesforceを高速に横断検索する

この記事では，[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してSalesforce内のオブジェクトを横断検索する方法を紹介します．

これはFess上で実際に検索を行っている画面のスクリーンショットです．
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/4062d3aa-1482-2344-7210-3d6ffeb5dab4.png)


# 導入手順

FessでSalesforceを横断検索するための手順を説明します．

導入の流れは次のようになります．

1. Fessの起動
1. プラグイン追加
1. 認証設定
1. Fessの設定・クローラ実行

## 1. Fessの起動

「[起動および停止方法](https://fess.codelibs.org/ja/13.6/install/run.html)」を参考にFessを起動します．

## 2. プラグイン追加

「[プラグイン](https://fess.codelibs.org/ja/13.6/admin/plugin-guide.html)」を参考にfess-ds-salesforce-xx.x.xをインストールします。

## 3. 認証設定

データを取得するためには，認証情報をパラメータとして与える必要があります．

### 3-1. 証明書準備

「証明書」と「秘密鍵」を準備する必要があります．

ここでは，Salesforceの自己署名証明書を用いる方法を紹介します．

「[自己署名証明書の生成](https://help.salesforce.com/articleView?id=security_keys_creating.htm&type=5)」を参考に，証明書を作成します．この時，指定した表示ラベル(エイリアス)を以降`fess`とします．
「キーストアにエクスポート」を行います．この時，ダウンロードしたファイル名を以降`fess.jks`とします．

キーストアから証明書(`fess.crt`)を取り出します．

```bash
keytool -exportcert -keystore fess.jks -alias fess -file fess.crt
```

キーストアから秘密鍵(`key.pem`)を取り出します．

```bash
keytool -importkeystore \
    -srckeystore fess.jks \
    -srcstorepass "" \
    -destkeystore fess.p12 \
    -deststoretype PKCS12 \
    -srcalias fess \
    -deststorepass changeit \
    -destkeypass changeit
```

```bash
openssl pkcs12 -password pass:changeit -in store.p12 -nodes -nocerts | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > key.pem
```

実際にパラメータとして与える時は改行が不要なため，以下で出力される文字列を利用します．

```bash
cat key.pem | tr -d '\n'
```

### 3-2. アプリケーション作成

「[接続アプリケーションの作成](https://help.salesforce.com/articleView?id=connected_app_create.htm)」を参考にアプリケーションを作成します．

その際，必須情報に加え，
「OAuth設定の有効化」のチェックを入れ，
「コールバックURL」に`https://login.salesforce.com/services/oauth2/success`を入力し，
「デジタル署名を使用」のチェックを入れて，先程の証明書ファイルを選択し，
「選択したOAuth範囲」で`api` `openid` `offline_access`を追加します．

アプリケーションを作成したら，コンシューマ鍵(client_id)を取得して，
`https://login.salesforce.com/services/oauth2/authorize?response_type=token&client_id=${client_id}&redirect_uri=https://login.salesforce.com/services/oauth2/success`
からアプリケーションに許可を与えます．

## 4. Fessの設定・クローラ実行

Salesforceをクロールするための設定をします．
「[データストアクロール](https://fess.codelibs.org/ja/12.5/admin/dataconfig-guide.html)」も参考にしてください．

### 4-1. クローラの設定

Fessの管理画面を開き，`クローラ > データストア`と移動し，新規作成をします．
新規作成画面では，

* 名前
* ハンドラ
* パラメータ

の4項目を設定して，作成を完了します．

「名前」には好きな文字列を入力してください．
「ハンドラ」は`Salesforce`を選択してください．
「パラメータ」は次のようなフォーマットで入力してください．

```
base_url=https://login.salesforce.com
auth_type=oauth
username=admin@example.com
client_id=3MVG9I1kFE5Iul2DewTbNB1_YcSY0ptj5SCZIhdYPfIsVczSBZWGZRYSUs8tRyRgDRucoa8IK_bEnAwRzgbSZ
private_key=MIIEvQ...
custom=FessObj,...
FessObj.title=name
FessObj.contents=name,body
```

キーと値の説明は次のようになります．

| キー | 値 |
| --- | --- |
| base_url | SalesforceサーバーのURL（`https://test.salesforce.com`等） |
| username | ユーザー名 |
| auth_type | `oauth`または`password`（passwordの場合，`password` `client_secret`が必要） |
| client_id | 3-2で取得したコンシューマ鍵 |
| private_key | 3-1で作成した秘密鍵 |
| custom | カスタムオブジェクト名（`,`区切り） |
| ${オブジェクト名}.title | 検索結果でタイトルに該当する項目名 |
| ${オブジェクト名}.contents | ドキュメントのコンテンツ（インデックス対象文字列）に該当する項目名（`,`区切り） |

### 4-2. ジョブスケジューラの作成

4-1で作成したクロールをクリックすると，クロール設定が開き，そこから「新しいジョブの作成」をします．

後からでも変更はできるので、とりあえず試す場合はそのままの設定で大丈夫です。
詳しい設定については，「[スケジューラ](https://fess.codelibs.org/ja/12.5/admin/scheduler-guide.html)」を参考にしてください．

### 4-3. クローラの実行

`システム > スケジューラ`と移動し，4-2で作成したジョブを開きます．
その画面から，「今すぐ開始」をします．

状態が「実行中」から「有効」になるまで待ちます．

### 4-4. 検索のテスト

検索フォームから適当に検索してみます．
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/4062d3aa-1482-2344-7210-3d6ffeb5dab4.png)

これでFessでSalesforceを横断検索することが出来るようになりました．