Fess+外部Elasticsearch導入手順【Windows】


公式のドキュメントのインストール手順がわかりづらい上に誤りと思われる部分があるので、それを改善した手順をまとめました。

# 環境
- Windows 10
- JDK 11
- Fess 13.4.3
- Elasticsearch 7.4.2
 - plugin 7.4.0

FessとElasticsearchのバージョンの対応は公式ドキュメントで示されている「安定版」と必ず同一にします。

上記は2019/12/10時点で最新版の環境ですが、1つ前の`Fess 13.3.2 / Elasticsearch 7.3.2 / plugin 7.3.0`でも同様の手順で導入ができることを確認しています。

# Fessの導入
## ダウンロード
GitHubでFessをダウンロードして、任意のディレクトリに解凍します。
https://github.com/codelibs/fess/releases/tag/fess-13.4.3

## Elasticクラスタ接続設定
`bin`ディレクトリに格納されている`fess.in.bat`を編集します。
適当なテキストエディタで開くと、121～123行目に以下のような記述があります。

```fess.in.bat
REM External elasticsearch cluster
REM set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.es.http_address=http://localhost:9200
REM set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.dictionary.path=%ES_HOME%/config/
```

122行目の`REM`（コメントアウト）を外して保存します。

```fess.in.bat
REM External elasticsearch cluster
set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.es.http_address=http://localhost:9200
REM set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.dictionary.path=%ES_HOME%/config/
```


この時、**123行目もコメントアウトを外してしまうと動作しなくなります。**最早消しておいてもいいと思います。また、公式ドキュメント通りに、例えば以下のように設定を書き換えても、同様に動作しなくなります。

```fess.in.bat
REM External elasticsearch cluster
set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.es.http_address=http://localhost:9200
set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.dictionary.path="c:/elasticsearch-7.4.2/config/"
```

Fess側の設定は以上です。

# Elasticsearchの導入
## ダウンロード
公式サイトでElasticsearchをダウンロードします。`WINDOWS`をクリックすればダウンロードが始まります。今回は解凍先をCドライブ直下とします。
https://www.elastic.co/jp/downloads/past-releases/elasticsearch-7-4-2

## プラグインのインストール
コマンドプロンプトで以下のコマンドを1行ずつ入力していきます。minhash以外のすべてのプラグインでインストールの許可を求められます。まとめて実行しようとすると拒否した扱いになり、インストールが完了しません。

```
c:/elasticsearch-7.4.2/bin/elasticsearch-plugin install org.codelibs:elasticsearch-analysis-fess:7.4.0
c:/elasticsearch-7.4.2/bin/elasticsearch-plugin install org.codelibs:elasticsearch-analysis-extension:7.4.0
c:/elasticsearch-7.4.2/bin/elasticsearch-plugin install org.codelibs:elasticsearch-configsync:7.4.0
c:/elasticsearch-7.4.2/bin/elasticsearch-plugin install org.codelibs:elasticsearch-dataformat:7.4.0
c:/elasticsearch-7.4.2/bin/elasticsearch-plugin install org.codelibs:elasticsearch-minhash:7.4.0
```

コマンドを実行すると次のような出力があります。

```cmd.exe
-> Downloading org.codelibs:elasticsearch-analysis-fess:7.4.0 from maven central
[=================================================] 100%??
Warning: sha512 not found, falling back to sha1. This behavior is deprecated and will be removed in a future release. Please update the plugin to use a sha512 checksum.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission suppressAccessChecks
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]
```

`Continue with installation?`と問われるので`y`を入力してエンターを押せばインストールが完了します。

## 設定の追加
`config`ディレクトリ内の`elasticsearch.yml`を編集します。
テキストエディタで開き、次のテキストを追加します。`#`はコメントアウトなので気を付けます。最下行に追加すると良いと思います。

```elasticsearch.yml
configsync.config_path: c:/elasticsearch-7.4.2/config/
```

Elasticsearchの設定は以上です。

# 起動・確認
起動は必ずElasticsearch → Fessの順で行います。
## Elasticsearch
`C:/elasticsearch-7.4.2/bin`にある`elasticsearch.bat`をダブルクリックして起動します。ターミナルが表示され、起動処理が始まります。しばらくして次のようなログが出力されていればElasticsearchの起動は成功です。

```cmd.exe
[2019-12-10T12:00:00,000][INFO ][o.e.n.Node               ] [hoge] started
[2019-12-10T12:00:00,000][INFO ][o.e.c.r.a.AllocationService] [hoge] Cluster health status changed from [RED] to [GREEN] (reason: [shards started [[.configsync][0]] ...]).
[2019-12-10T12:00:00,000][INFO ][o.c.e.c.s.ConfigSyncService] [hoge] ConfigFileUpdater is started at 1m intervals.
```

ブラウザでも確認してみましょう。`localhost:9200`にアクセスします。すると、次のようなjson形式の結果が表示されます。

```
{
  "name" : "hoge",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hogehoge",
  "version" : {
    "number" : "7.3.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "hogehoge",
    "build_date" : "2019-12-10T12:00:00.000000Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

プラグインの導入状況も確認してみましょう。`http://localhost:9200/_cat/plugins?v&s=component&h=name,component,version,description&pretty`にアクセスすると、次のようなjson形式の結果が表示されます。

```
name   component          version description
hoge analysis-extension 7.4.0   This plugin provides an analysis library.
hoge analysis-fess      7.4.0   FessAnalysis Plugin for Elasticsearch
hoge configsync         7.4.0   ConfigSync plugin syncs up with configuration files in .configsync index.
hoge dataformat         7.4.0   This plugin provides several response formats.
hoge minhash            7.4.0   This plugin provides b-bit minhash algorism.
```

## Fess
`bin`ディレクトリの`fess.bat`をダブルクリックして起動します。ターミナルが表示されます。初回起動時は、起動してしばらくするとElasticsearchが動きだすので少し待ちます。

`localhost:8080`にアクセスして、ページが表示されれば成功です。

# おわりに
公式ドキュメントでは「5 分で簡単に構築可能な全文検索サーバー」と謳っていますが、それはあくまでElasticsearch組み込み版での話のようです。外部Elasticsearchを導入しようとしたところ、5分どころか無限に時間を食わんばかりの苦労を強いられました。

これからFess + 外部Elasticsearchを利用しようとしている人がこの記事にたどり着いて、文字通り「5分で簡単に構築」できてくれたら幸いです。