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

この記事では、[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してSlackのメッセージを横断検索する方法を紹介します。

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/157315b2-6747-9f45-ad7d-b5895a90e91c.png)

# 導入手順

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

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

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

## 1. プラグイン追加

Fessの現バージョン(12.3.0)には、デフォルトでは含まれていない機能であるため、自分で追加する必要があります。
[ここ](http://central.maven.org/maven2/org/codelibs/fess/fess-ds-slack/12.2.0/)からfess-ds-slack-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. Slackアプリ作成
[このページ](https://api.slack.com/apps)で「Create New App」をクリックしてSlackアプリを作成します。

App Nameは自分が分かれば何でもOKです。
Development Slack Workspaceは検索をしたいワークスペースを指定します。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/1cade7d8-7d38-5d7f-853d-68841cc6e2a9.png)

### 3-2. Permission設定

アプリ作成後、左側のメニューから「OAuth & Permissions」を選択し、Scopesを設定します。

とりあえず必要なのは、`channels:history`, `channels:read`, `users:read`, `users.profile:read`, `team:read`です。
(`files:read`が必要となる機能は今後実装予定です)

![](https://qiita-image-store.s3.amazonaws.com/0/281037/c38f065e-38bc-d573-0a30-9f6886cec11d.png)

### 3-3. アプリインストール

同ページの上部から、「Install App to Workspace」します。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/8258f755-e797-e59e-f656-8dc26453b526.png)

インストール後に「OAuth Access Token」として表示されている文字列が後で必要になります。

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

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

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

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

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

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

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

```
token=xoxp-************-************-************-********************************
channels=general,random
```

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

| キー | 値 |
| --- | --- |
| token | 3-3で入手したアクセストークン |
| channels | 検索対象チャンネル(`,`区切りでチャンネルを指定、`*all`で全てのチャンネル) |

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

```
title=message.user + " #" + message.channel
digest=message.text + "\n" + message.attachments
content=message.text
created=message.timestamp
timestamp=message.timestamp
url=message.permalink
```

取得出来る値のキーと値の説明は次のようになります。
ここで言う「Message」はSlackの1メッセージを指しています。

| キー | 値 |
| --- | --- |
| message.text | Messageの内容 |
| message.user | Messageを送信したユーザ名(表示名) |
| message.channel | Messageが送信されたチャンネル名 |
| message.timestamp | Messageが送信された日時 |
| message.permalink | MessageをSlack上で開くリンク |
| message.attachments | Messageの添付項目の要約 |

設定画面はこんな感じになります。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/3e133cc3-1fea-cf3d-fb62-7f6d94f6c646.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/157315b2-6747-9f45-ad7d-b5895a90e91c.png)

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