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

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

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/632fe7cd-ea7e-2601-13f8-78a0f577524d.png)

なお、この機能の利用には[一般法人向けのOffice365](https://products.office.com/ja-jp/business/office-365-business)が必要となります。

# 導入手順

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

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

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


## 1. プラグイン追加

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

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

## 2. Fessの起動

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

## 3. 認証設定

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

### 3-1. Azure Active Directory 利用

[Office 365 で無料の Azure Active Directory サブスクリプションを使用する](https://docs.microsoft.com/ja-jp/office365/securitycompliance/use-your-free-azure-ad-subscription-in-office-365)
を参考にAzure ADの利用を開始します。

この際、ディレクトリID(`tenant`)を記録しておきます。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/6a39c605-89c2-250c-aa4b-04ed5a12402f.png)

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

[My Application](https://apps.dev.microsoft.com/)を開き、アプリの追加をします。

アプリケーション名は分かれば何でも大丈夫です。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/36f521ff-0a35-77f9-e4ba-7c9134044797.png)

作成後、アプリケーションID(`client_id`)を記録しておきます。
次に、アプリケーション シークレットから新しいパスワードを生成し、それ(`client_secret`)を記録しておきます。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/45699047-e8a5-e38f-15ff-52f51451741a.png)

プラットフォームの追加でネイティブアプリケーションを追加します。

次に、アプリケーションのアクセス許可を変更します。
今回は「Directory.Read.All」「Files.Read.All」「Group.Read.All」「Notes.Read.All」「Sites.Read.All」「User.Read.All」を追加します。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/134b29b2-1e90-49a7-e9bd-e63b3f923fc9.png)

ここまで終わったらアプリケーションを保存します。

次に、
https://login.microsoftonline.com/${tenant}/adminconsent?client_id=${client_id}&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
を管理者権限のあるアカウントで開きます。
URLが、`https://login.microsoftonline.com/common/oauth2/nativeclient?admin_consent=True&tenant=${tenant}`に変わったら大丈夫です。

### 3-3. LDAP認証の設定

Office365にはユーザーやグループごとにドライブがあり、ユーザーによってアクセス可能なリソースが異なります。
検索結果にアクセス不可能なりソースを表示させないために、LDAP認証の設定を行います。

[Azure AD Domain Services のマネージド ドメインに対するセキュリティで保護された LDAP (LDAPS) の構成](https://docs.microsoft.com/ja-jp/azure/active-directory-domain-services/active-directory-ds-admin-guide-configure-secure-ldap)を参考にAzure ADのLDAPSを有効にします。

LDAPSが有効になったら、Secure LDAP外部IPアドレス または バインドされているカスタムドメイン (`server_name`)を記録しておきます。

また、Office365にはディレクトリ全体で共有されるドライブがありますが、「ディレクトリ全体」を示すグループはデフォルトでは無いため、そこにアクセス可能なグループを作る必要があります。

Azure AD Premium ライセンスがある場合、
[Azure Portal](https://portal.azure.com/)で`[Azure Active Directory] > [グループ] > [全般]`を開き、ディレクトリ内の"すべてのユーザー"グループを有効にすると、All Usersというグループが作成されます。

ライセンスがない場合、
`[Azure Active Directory] > [グループ] > [新しいグループ]`を開き、検索を許可したいユーザーを含むセキュリティグループを作成します。
この場合、ディレクトリに新しくユーザーが追加された時に、自動的に追加は出来ないので注意が必要です。

ライセンスの有無に関わらず作成したグループ名を記録しておきます。

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

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

### 4-1. LDAP設定

LDAPを利用する場合、設定が必要です。
Fessの管理画面を開き、`[システム] > [全般]`と移動します。

LDAP URLは3-3で記録したアドレスを`server_name`として、`ldaps://${server_name}:636/`といった形式で入力します。
Base DNはexample.comの場合`OU=AADDC Users,DC=example,DC=com`のような形式で入力します。
Bind DNとパスワードはAzure ADで管理者権限があるアカウントを指定します。
User DNは`%s`、
アカウントフィルタは`(&(objectClass=user)(userPrincipalName=%s))`、
グループフィルタは空欄、
memberOf属性は`memberOf`という感じで入力します。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/5a41e485-a8f4-f4c3-5ceb-2f92f1f6edbd.png)

この設定後、Azure ADのアカウントでログイン出来れば設定完了です。

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

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

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

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

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

```
tenant=********-****-****-****-************
client_id=********-****-****-****-************
client_secret=***********************
```

キーと値は3. で記録したものと対応しています。

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

```
title=files.name
content=files.description + "\n" + files.contents
mimetype=files.mimetype
created=files.created
last_modified=files.last_modified
url=files.web_url
role=files.roles
```

「パーミッション」はディレクトリ全体で共有されているドライブにアクセス可能なユーザー、グループを指定します。
3-3. で作成したグループ`All Users`の場合、`{group}All Users`という感じで入力します。

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

| キー | 値 |
| --- | --- |
| files.name | Fileの名前 |
| files.description | Fileの説明 |
| files.contents | Fileの中身（テキスト） |
| files.mimetype | FileのMIMEタイプ |
| files.created | Fileの作成日時 |
| files.last_modified | Fileの最終編集日時 |
| files.web_url | FileをWeb上で閲覧するリンク |
| files.roles | Fileにアクセス可能なrole |

設定画面はこんな感じになります。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/d5d3b825-72ab-0d40-6774-d9f5ff88478d.png)


#### OneNoteのクロール

Office365にはOneNoteが含まれていて、それもクロールすることが可能になっています。
OneNoteのクロールをする場合、
「バンドラ」は`OneNote`、

「スクリプト」は次のようなフォーマットで入力します。

```
title=notebooks.name
content=notebooks.contents
created=notebooks.created
last_modified=notebooks.last_modified
url=notebooks.web_url
role=notebooks.roles
```

取得出来る値のキーと値の説明は次のようになります。
ここで言う「Notebook」はOneNoteの1ノートブックを指しています。

| キー | 値 |
| --- | --- |
| notebooks.name | Notebookの名前 |
| notebooks.contents | Notebookの中身（テキスト） |
| notebooks.created | Notebookの作成日時 |
| notebooks.last_modified | Notebookの最終編集日時 |
| notebooks.web_url | NotebookをWeb上で閲覧するリンク |
| notebooks.roles | Notebookにアクセス可能なrole |

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

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

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

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

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

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

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

検索フォームから適当に検索してみます。
この時、他の人のドライブのファイルが検索結果に表示されないことを確認します。

![](https://qiita-image-store.s3.amazonaws.com/0/281037/632fe7cd-ea7e-2601-13f8-78a0f577524d.png)