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

この記事では、[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してGoogleDrive内のファイルを横断検索する方法を紹介します。

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/89eae17d-69a3-c4a1-3749-067462a930d0.png)

# 導入手順

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

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

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

## 1. プラグイン追加

Fessの現バージョン(12.3.2)には、デフォルトでは含まれていない機能であるため、自分で追加する必要があります。
[ここ](http://central.maven.org/maven2/org/codelibs/fess/fess-ds-gsuite/12.2.0/)からfess-ds-gsuite-12.2.0.jarをダウンロードします。
ダウンロードしたjarファイルは`[Fessのパス]/app/WEB-INF/lib/`に配置します。

## 2. Fessの起動

[このページ](https://fess.codelibs.org/ja/12.3/install/run.html)を参考にFessを起動します。

## 3. 認証設定

データを取得するために認証情報をパラメータとして与える必要があり、そのための設定を行います。

### 3-1. プロジェクトを作成

https://console.developers.google.com/ にアクセスして、新しいプロジェクトを作成します。
プロジェクト名は自分で分かれば何でも大丈夫です。

### 3-2. Google Drive APIを有効化

ダッシュボードの左欄から「ライブラリ」を開き、「Google Drive API」を有効化します。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/cb7ee3fb-cfed-bf91-0e04-ad584ed8912a.png)

![](https://qiita-image-store.s3.amazonaws.com/0/281037/517f674a-8795-5603-8332-bd440f09cb51.png)

これが無いと、GoogleDriveのファイルにアクセスすることが出来ません。

### 3-3. 認証情報を作成

ダッシュボードの左欄から「認証情報」を開き、認証情報(サービスアカウント キー)を作成します。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/d98d814f-dd4f-fd52-f92f-1935118bb587.png)

サービスアカウント名は自分で分かれば何でも、役割は設定しなくても大丈夫です。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/416841c2-9f7e-009b-0d42-40af100cc387.png)

作成が終わると認証情報を含むJSONがダウンロードされます。
このJSONの中身を後々利用します。

### 3-4. サービスアカウントにフォルダを共有

GoogleDriveを開いて、検索対象としたいフォルダをサービスアカウントに共有します。
共有の仕方は、フォルダを右クリック→共有で、先程のJSON内の"client_email"の値を入力します。
この時、通知がONだと、Mailer Daemonさんからメールが来ることになるのでOFFにしましょう。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/13a05efd-1d7d-5998-114c-5e5ae94a532a.png)

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

GoogleDriveをクロールするための設定をします。
公式ドキュメントの[このページ](https://fess.codelibs.org/ja/12.3/admin/dataconfig-guide.html)も参考にしてください。

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

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

* 名前
* ハンドラ
* パラメータ
* スクリプト

の4項目を設定して、作成を完了します。

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

```
private_key=-----BEGIN PRIVATE KEY-----\nMIIEv ... =\n-----END PRIVATE KEY-----\n
private_key_id=46812 ... b33f8
client_email=****@****.iam.gserviceaccount.com"
```

キーと値は3-3でダウンロードしたJSONのキーと値に対応しています。

「スクリプト」は次のようなフォーマットで入力してください。

```
title=files.name
content=files.description+"\n"+files.contents
mimetype=files.mimetype
created=files.created_time
last_modified=files.modified_time
url=files.web_view_link
thumbnail=files.thumbnail_link
```

取得出来る値のキーと値の説明は次のようになります。
ここで言う「File」はGoogleDriveの1ファイルを指しています。

| キー | 値 |
| --- | --- |
| files.name | Fileの名前 |
| files.description | Fileの説明 |
| files.contents | Fileの中身（テキスト） |
| files.mimetype | FileのMIMEタイプ |
| files.created_time | Fileの作成日時 |
| files.modified_time | Fileの最終編集日時 |
| files.web_view_link | FileをWeb上で閲覧するリンク |
| files.thumbnail_link | Fileのサムネイルを取得するリンク |

設定画面はこんな感じになります。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/e3e88136-d06b-e876-9c41-da93b51276af.png)

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

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

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

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

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

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

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

検索フォームから適当に検索してみます。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/89eae17d-69a3-c4a1-3749-067462a930d0.png)

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