Fess環境構築メモ

# はじめに

FessというOSSの全文検索サーバーがあります。こいつをセットアップして軽く使ってみた時のメモです。
PDFやExcelファイルをクロールして取り込み、それらを検索する、という所までやってみます。

# 環境
Windows10のOracle VirtualBox上にRHEL V7.6上に環境を構築
Elasticsearch V7.2
Fess V13.2

# インストール/セットアップ
この辺を参考に
[Fessインストール](https://fess.codelibs.org/ja/13.2/install/install.html)
[Fessダウンロード](https://fess.codelibs.org/ja/downloads.html)

## OpenJDK11
前提となるJavaをセットアップします。
[OpenJDKダウンロード](https://jdk.java.net/java-se-ri/11)

解凍&セットアップ

```
[root@test08 /Inst_Image/openJDK]# update-alternatives --install /usr/bin/java java /opt/openjdk/jdk-11/bin/java

[root@test08 /Inst_Image/openJDK]# alternatives --config java

3 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
   1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64/jre/bin/java)
*+ 2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java)
   3           /opt/openjdk/jdk-11/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:3

[root@test08 /Inst_Image/openJDK]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
[root@test08 /Inst_Image/openJDK]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
```
## Fessのインストール

rpmパッケージをダウンロードしてインストールします。

```
[root@test08 /Inst_Image/fess]# rpm -ivh fess-13.2.0.rpm
準備しています...              ################################# [100%]
Creating fess group... OK
Creating fess user... OK
更新中 / インストール中...
   1:fess-13.2.0-1                    ################################# [100%]
### NOT starting on installation, please execute the following statements to configure fess service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable fess.service
### You can start fess service by executing
 sudo systemctl start fess.service
```


## Elasticsearchインストール
Fessは裏でElasticsearchにデータを蓄えることになるため、Elasticsearchをインストールします。
rpmパッケージをダウンロードしてインストールします。

```
[root@test08 /Inst_Image/elastic]# rpm -Uvh elasticsearch-7.2.0-x86_64.rpm
警告: elasticsearch-7.2.0-x86_64.rpm: ヘッダー V4 RSA/SHA512 Signature、鍵 ID d88e42b4: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:elasticsearch-0:7.2.0-1          警告: /etc/elasticsearch/elasticsearch.yml は /etc/elasticsearch/elasticsearch.yml.rpmnew として作成されました。
################################# [ 50%]
整理中 / 削除中...
   2:elasticsearch-0:6.5.3-1          ################################# [100%]
Created elasticsearch keystore in /etc/elasticsearch
```

ついでに念のためKibanaとLogstashも入れておきます(Fess使うぶんには不要だけど)。

## ElasticsearchにFessのプラグインを追加

ネットワーク経由でインストールを試みるが、なぜか失敗！

```
[root@test08 ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-analysis-fess:7.2.0
Exception in thread "main" java.net.UnknownHostException: repo1.maven.org
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
        at java.base/java.net.Socket.connect(Socket.java:591)
        at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:285)
        at java.base/sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
        at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
        at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:265)
        at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:372)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1075)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179)
        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:164)
        at org.elasticsearch.plugins.InstallPluginCommand.urlExists(InstallPluginCommand.java:352)
        at org.elasticsearch.plugins.InstallPluginCommand.getMavenUrl(InstallPluginCommand.java:332)
        at org.elasticsearch.plugins.InstallPluginCommand.download(InstallPluginCommand.java:262)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:229)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.Command.main(Command.java:90)
        at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)

```

なにやらうらでMavenが動いて要るっぽいが、repo1.maven.orgにアクセスできてないっぽい。

```
[root@test08 ~]# ping repo1.maven.org
ping: repo1.maven.org: 名前またはサービスが不明です
```

おやおや？Windows(ホストOS)ではping通るのに？！

ここに書かれているプラグインを個別にダウンロードしてみることにします。
https://fess.codelibs.org/ja/13.2/install/install.html

オフラインででElasticsearchのプラグインをインストールする場合?
https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugin-management-custom-url.html

ここから、必要なバージョンのzipファイルをダウンロード
https://repo1.maven.org/maven2/org/codelibs/

ダウンロードしたプラグインを個別にインストールします。

```
[root@test08 /Inst_Image/fess/es_plugins]# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///Inst_Image/fess/es_plugins/elasticsearch-analysis-fess-7.2.0.zip
-> Downloading file:///Inst_Image/fess/es_plugins/elasticsearch-analysis-fess-7.2.0.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     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]y
-> Installed analysis-fess
```

他も同様に。

確認

```
[root@test08 /usr/share/elasticsearch/plugins]# ls -la
合計 4
drwxr-xr-x. 7 root root  104  7月 16 13:04 .
drwxr-xr-x. 7 root root  128  7月 15 19:33 ..
drwxr-xr-x. 2 root root  194  7月 16 13:03 analysis-extension
drwxr-xr-x. 2 root root  117  7月 16 12:57 analysis-fess
drwxr-xr-x. 2 root root  144  7月 16 13:03 configsync
drwxr-xr-x. 2 root root 4096  7月 16 13:03 dataformat
drwxr-xr-x. 2 root root  132  7月 16 13:04 minhash
```

## Elasticsearch設定変更

/etc/elasticsearch/elasticsearch.yml編集して以下を追加します。

```yml:elasticsearch.yml
configsync.config_path: /var/lib/elasticsearch/config
```

/etc/elasticsearch/jvm.optionsを編集してヒープのサイズを増やしておきます。

```options:jvm.options
-Xms2g
-Xmx2g
```


## FESS設定変更

/usr/share/fess/bin/fess.in.shを編集
以下のコメントアウトをはずして有効化

```sh:fess.in.sh
ES_HTTP_URL=http://localhost:9200
FESS_DICTIONARY_PATH=/var/lib/elasticsearch/config/
```

/etc/fess/fess_config.propertiesを編集

```properties:fess_config.properties
# Elasticsearch
elasticsearch.http.url=http://localhost:9200
elasticsearch.cluster.name=elasticsearch
...
-Xmx2g\n\
...
crawler.metadata.name.mapping=
...
```

crawler.metadata.name.mappingについては、PDFファイルのリンク表示がおかしくなる問題のための対応です。
参考:
[Replace doc.content_title with doc.filename #1235](https://github.com/codelibs/fess/issues/1235)
[検索出来ないファイルについて](https://ja.osdn.net/projects/fess/forums/18580/38708/)


-Xmx2gは、Fessのヒープ設定(デフォルト512mなので必要に応じてチューニング)
参考: [システム関連の設定](https://fess.codelibs.org/ja/13.2/config/system.html)

/etc/sysconfig/fessを編集。こっちはクローラーのヒープ設定。

```txt:fess
FESS_HEAP_SIZE=2g
```



## RHELのFirewall設定

以下のポートをあけます。

Fess: 8080
Elasticsearch: 9200
Kibana: 5601 (Fessを使う分には不要だが、一応)

コマンド例(他のポートも同様に)

```
[root@test08 /etc/firewalld/zones]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[root@test08 /etc/firewalld/zones]# firewall-cmd --reload
success

```

変更結果は以下のファイルに反映されるので念のため確認しておきます。

```xml:/etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="9200"/>
  <port protocol="tcp" port="5601"/>
  <port protocol="tcp" port="8080"/>
</zone>
```

## 追加設定

### クロールするファイルサイズ制限

/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xmlを編集する必要があるらしい。
デフォルト10Mで、さらにファイルの種類ごとに上限がきられているので、要件に合わせて適宜修正します。

```xml:contentlength.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
        "http://dbflute.org/meta/lastadi10.dtd">
<components namespace="fessCrawler">
        <include path="crawler/container.xml" />

        <component name="contentLengthHelper"
                class="org.codelibs.fess.crawler.helper.ContentLengthHelper" instance="singleton">
                <property name="defaultMaxLength">104857600</property><!-- 10M -->
                <postConstruct name="addMaxLength">
                        <arg>"text/html"</arg>
                        <arg>2621440</arg><!-- 2.5M -->
                </postConstruct>
        </component>
</components>
```

参考: [クローラ関連の設定](https://fess.codelibs.org/ja/13.2/config/crawler.html)


# 起動
systemctlコマンドで、Elasticserach, Fessを制御できます。

```
[root@test08 /etc/sysconfig]# systemctl start elasticsearch.service
[root@test08 /etc/sysconfig]# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2019-09-06 15:19:55 JST; 7s ago
     Docs: http://www.elastic.co
 Main PID: 5865 (java)
    Tasks: 27
   CGroup: /system.slice/elasticsearch.service
           tq5865 /usr/share/elasticsearch/jdk/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupanc...
           mq5968 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

 9月 06 15:19:55 test08 systemd[1]: Started Elasticsearch.
 9月 06 15:19:55 test08 systemd[1]: Starting Elasticsearch...
 9月 06 15:19:57 test08 elasticsearch[5865]: OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was depr...ease.
Hint: Some lines were ellipsized, use -l to show in full.

[root@test08 /etc/sysconfig]# systemctl start fess.service
[root@test08 /etc/sysconfig]# systemctl status fess.service
● fess.service - Fess
   Loaded: loaded (/usr/lib/systemd/system/fess.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2019-09-06 15:20:20 JST; 11s ago
     Docs: http://fess.codelibs.org/
 Main PID: 6125 (java)
    Tasks: 31
   CGroup: /system.slice/fess.service
           mq6125 /bin/java -Xms2g -Xmx2g -Djava.awt.headless=true -Dhttp.maxConnections=20 -Djna.nosys=true -Djdk.io.p...

 9月 06 15:20:20 test08 systemd[1]: Started Fess.
 9月 06 15:20:20 test08 systemd[1]: Starting Fess...
```

# 管理コンソール

http://xxx:8080/admin にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8d0540ab-318e-5c34-7d22-d9c0cb463fc0.png)

adminでログインすると管理コンソールが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/881c7c45-f5b0-fc50-6126-b01ce8793b58.png)


## ファイルのクロール設定

ゲストOSの/oneWexDemo01というディレクトリをマウントポイントとして、ホストOS上のファイルシステムをマウントし、その配下にクロール対象のファイルを配置しておきます。
で、/oneWexDemo01をクロール対象のディレクトリとして設定することにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/387e5a42-f1da-4d8c-b0d1-1c350361d68c.png)

作成したクローラーに対して、ジョブを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/928a56ec-c065-f431-d19c-b38fb9d80a21.png)

cron設定と同じ指定方法で、クローラーが動くタイミングを指定できるようです。


## クロールしたデータの自動削除セットアップ

クロールして取り込んだデータはデフォルトだと3日で削除されるようになっています。
FESS管理画面から システム - 全般 メニューのクローラの欄で、
以前のドキュメントを削除: 3日 (デフォルト ) => -1にすると、自動削除は行われません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a859c989-2832-78cc-924f-5a1980b825be.png)


# 検索を試す
http://xxx:8080/ にアクセスすると、検索画面が表示されるので、ここにキーワードを入れて検索することができます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/70e57b8b-1012-52ad-e3f7-05bda999849e.png)

こんな感じで結果が表示されます。(ここでは、IMSのマニュアルやらダミーのExcelファイルなどをクロールさせています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/207a9ef4-694f-f187-6f32-887daefaaa11.png)

リンクをクリックすると、当然そのファイルをブラウザ経由で取得できます。PDFだったらそのままブラウザで開きますし、Excelやワードであればブラウザ経由でダウンロードしてそれぞれのツールで開くことができます。ステキです！

詳細検索オプションもこんな感じで提供されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/18044a7c-f8f2-b3e9-b17f-da45a1c722cd.png)

ソートのメニューはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a12e60af-048f-4214-4212-a50899d69030.png)

こういう検索画面がデフォルトで提供されて、サクッと動くのがすごいですねぇ。

# 補足
## 検索ログ
管理コンソールのシステム情報 - 検索ログ というメニューから、検索アクティビティに関するログを参照することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fcb7b618-04aa-8e3a-5b9b-5689c6f56c36.png)

ログ種別として、以下のようなログを収集してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f990bdbb-7f72-c815-9461-357086cd6ce5.png)

検索に使用されたキーワードや、検索しようとしたけど結果が0件だったものや、検索して実際にクリックされたものなど、かなり有用なログが取られています。素晴らしいですねぇ。

## 辞書
各種辞書の設定もできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c53a783a-f600-07de-0f15-1a86551a49e5.png)

参考: [辞書](https://fess.codelibs.org/ja/13.3/admin/dict-guide.html)

形態素解析にはkuromojiが使われていたりするのでそのための辞書とか、同義語の設定なんかもカスタマイズできますね。


# おわりに
Fessは"5分で簡単に構築可能"と謳っているだけあって、サクッと簡単に構築できますし、しかもそのままでも充分使い勝手の良い検索アプリを提供してくれています。
実際には5分じゃできなかったけど、Docker版とかもあるようなので、そちらを使えばもっと簡単にいけそうです。
OSSなので情報もたくさん出回っていて、取り込まれるデータもElasticsearchが使われるのでKibanaを一緒に入れれば、取り込まれたデータの確認もしやすかったりすので、色々と調査をするのもやりやすそうです。
無料でここまで使い勝手の良い全文検索サーバーが使えちゃうというのはほんと凄いですねぇ(正式サポートを受けるための有償サービスもあるようですし)。