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

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

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/940009b3-99bc-d4d6-8103-d44dff68fbb0.png)

# 導入手順

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

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

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

## 1. プラグイン追加

Fessの現バージョン(13.1.0)には、デフォルトでは含まれていない機能であるため、自分で追加する必要があります。

[ここ](http://central.maven.org/maven2/org/codelibs/fess/fess-ds-dropbox/)からfess-ds-dropbox-xx.x.x.jarをダウンロードします。
ダウンロードしたjarファイルは`$FESS_HOME/app/WEB-INF/lib/`に配置します。

## 2. Fessの起動

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

## 3. 認証設定

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

[App Console](https://www.dropbox.com/developers/apps)でアプリケーションの作成を行います。

設定はこんな感じです。
![setting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/413682e0-4f46-939f-d063-67ad8bc21995.png)

そして、アクセストークン(`access_token`)をGenerateしておきます。

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

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

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

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

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

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

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

```properties
access_token=**********
```

`access_token`は、3.で取得したものです。

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

```properties
url=file.url
title=file.name
content=file.contents
mimetype=file.mimetype
filetype=file.filetype
filename=file.name
content_length=file.size
last_modified=file.client_modified
```

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

| キー                 | 値                              |
| -------------------- | ------------------------------- |
| file.url             | Fileを閲覧するリンク            |
| file.contents        | Fileの中身（テキスト）          |
| file.mimetype        | FileのMIMEタイプ                |
| file.filetype        | Fileの種類                      |
| file.name            | Fileの名前                      |
| file.size            | Fileのサイズ                    |
| file.client_modified | Fileの最終編集日時（ローカル）  |
| file.server_modified | Fileの最終編集日時（Dropbox上） |

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

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

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

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

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

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

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

検索フォームから適当に検索してみます。
![sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/940009b3-99bc-d4d6-8103-d44dff68fbb0.png)

## アクセス権限の設定

「パラメータ」を

```properties
default_permissions={role}admin
```

「スクリプト」を

```properties
role=file.roles
```

のように設定すると、
あるファイルについて、RoleがadminであるFessユーザーもしくはDropbox上でアクセス権限を持つFessユーザーのみ、検索結果に表示させることができます。
「Dropbox上でアクセス権限を持つFessユーザー」とは、ユーザー名がDropbox上でそのファイルにアクセス権限を持つユーザーのメールアドレスと一致しているFessユーザーのことを指しています。

## Dropbox Paperの検索

「ハンドラ」で`DropboxPaper`を選択すると、Dropbox Paperの文書をクロールすることができます。

その際、
「パラメータ」は

```properties
access_token=**********
```

「スクリプト」は

```properties
title=paper.title
content=paper.contents
url=paper.url
mimetype=paper.mimetype
filetype=paper.filetype
role=paper.roles
```

というフォーマットで入力します。

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

| キー           | 値                      |
| -------------- | ----------------------- |
| paper.url      | Paperを閲覧するリンク   |
| paper.contents | Paperの中身（テキスト） |
| paper.mimetype | PaperのMIMEタイプ       |
| paper.filetype | Paperの種類             |
| paper.title    | Paperのタイトル         |
| paper.owner    | Paperの所有者           |