はじめに
FessというOSSの全文検索サーバーがあります。こいつをセットアップして軽く使ってみた時のメモです。
PDFやExcelファイルをクロールして取り込み、それらを検索する、という所までやってみます。
環境
Windows10のOracle VirtualBox上にRHEL V7.6上に環境を構築
Elasticsearch V7.2
Fess V13.2
インストール/セットアップ
この辺を参考に
Fessインストール
Fessダウンロード
OpenJDK11
前提となるJavaをセットアップします。
OpenJDKダウンロード
解凍&セットアップ
[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編集して以下を追加します。
configsync.config_path: /var/lib/elasticsearch/config
/etc/elasticsearch/jvm.optionsを編集してヒープのサイズを増やしておきます。
-Xms2g
-Xmx2g
FESS設定変更
/usr/share/fess/bin/fess.in.shを編集
以下のコメントアウトをはずして有効化
ES_HTTP_URL=http://localhost:9200
FESS_DICTIONARY_PATH=/var/lib/elasticsearch/config/
/etc/fess/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
検索出来ないファイルについて
-Xmx2gは、Fessのヒープ設定(デフォルト512mなので必要に応じてチューニング)
参考: システム関連の設定
/etc/sysconfig/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 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 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>
参考: クローラ関連の設定
起動
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 にアクセス
ファイルのクロール設定
ゲストOSの/oneWexDemo01というディレクトリをマウントポイントとして、ホストOS上のファイルシステムをマウントし、その配下にクロール対象のファイルを配置しておきます。
で、/oneWexDemo01をクロール対象のディレクトリとして設定することにします。
cron設定と同じ指定方法で、クローラーが動くタイミングを指定できるようです。
クロールしたデータの自動削除セットアップ
クロールして取り込んだデータはデフォルトだと3日で削除されるようになっています。
FESS管理画面から システム - 全般 メニューのクローラの欄で、
以前のドキュメントを削除: 3日 (デフォルト ) => -1にすると、自動削除は行われません。
検索を試す
http://xxx:8080/ にアクセスすると、検索画面が表示されるので、ここにキーワードを入れて検索することができます!
こんな感じで結果が表示されます。(ここでは、IMSのマニュアルやらダミーのExcelファイルなどをクロールさせています。)
リンクをクリックすると、当然そのファイルをブラウザ経由で取得できます。PDFだったらそのままブラウザで開きますし、Excelやワードであればブラウザ経由でダウンロードしてそれぞれのツールで開くことができます。ステキです!
こういう検索画面がデフォルトで提供されて、サクッと動くのがすごいですねぇ。
補足
検索ログ
管理コンソールのシステム情報 - 検索ログ というメニューから、検索アクティビティに関するログを参照することができます。
検索に使用されたキーワードや、検索しようとしたけど結果が0件だったものや、検索して実際にクリックされたものなど、かなり有用なログが取られています。素晴らしいですねぇ。
辞書
各種辞書の設定もできるようです。
参考: 辞書
形態素解析にはkuromojiが使われていたりするのでそのための辞書とか、同義語の設定なんかもカスタマイズできますね。
おわりに
Fessは"5分で簡単に構築可能"と謳っているだけあって、サクッと簡単に構築できますし、しかもそのままでも充分使い勝手の良い検索アプリを提供してくれています。
実際には5分じゃできなかったけど、Docker版とかもあるようなので、そちらを使えばもっと簡単にいけそうです。
OSSなので情報もたくさん出回っていて、取り込まれるデータもElasticsearchが使われるのでKibanaを一緒に入れれば、取り込まれたデータの確認もしやすかったりすので、色々と調査をするのもやりやすそうです。
無料でここまで使い勝手の良い全文検索サーバーが使えちゃうというのはほんと凄いですねぇ(正式サポートを受けるための有償サービスもあるようですし)。