Fess 13.1のリリース

今回は特に目新しい新機能はないと思うけど、変更点としては以下の感じ。

  • Elasticsearch 7.1系対応
  • Label Updaterをジョブに追加
  • 韓国語のNoriに対応
  • elasticsearch-httpclientの独自スレッドプール追加
  • サジェスト表示がバグっていたので修正

といった感じだろうか。ラベルの更新については今まで、ラベルの設定を変えたけど、再インデクシング以外に反映できないという状態だったのだけど、このバージョンからはスケジューラのジョブの中にLabel Updaterがあるので、それを実行すればラベルの更新をしてくれる。

という感じですが、ここから利用可能です。

ElasticsearchのログをGKEでStackdriverで取り込む

GKEとかで普通にElasticsearchを使って、コンソールのログをStackdriverで回収してもらえば、Logs Viewerで見ることができると思うけど、ログレベルがINFOかERRORの2択になる。つまり、WARNとかのログはINFOとして出てしまう。これはStackdriverに投げているfluentdがログメッセージのパースができなければ、stdoutならINFOで、stderrならERRORみたいな決め方になっているためで、fluentd-configmap.yamlあたりをみればわかる。

それではどうするか?だけど、fluentd-configmap.yamlには

format /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<log>.*)/

という感じでパースするフォーマットが書いてあるのでこれに合わせる必要がある。<time>\d{4}って、何を指しているのだろうとかも思ったけど、MMddだった。

Elasticsearchのでデフォルトのログフォーマットとかはlog4j2.propertiesを見ると

appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n

という感じになっていると思うけど、この辺のログフォーマットを

appender.console.layout.pattern = %.-1p%d{MMdd HH:mm:ss.SSSSSS} 1 [%node_name] %m%xThrowable{separator(|)}%n

みたいな感じで、patternたちを変更しておく。ログレベルが始めの1文字で表されている。pidはとりあえず適当に1とかにしたけど、きちんと取得してもよいのかも(試してない)。あとは、スタックトレースが1行内に収めないと、Stackdriver上で分解されれるので1行にしておく。

これも普通にぐぐると、エージェントを組み込むとか、GKEのfluentdの設定をカスタマイズするとかがほとんどな気がするので、このログフォーマット問題は結構ハマる気がする…。

AdoptOpenJDKをパッケージで入れる

ここの情報によると、AdoptOpenJDKでようやくオフィシャルなRPMとDEBファイルが提供されるようになったらしい。というわけで、Ubuntu 18.04に入れてみる。

# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# echo deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ bionic main > /etc/apt/sources.list.d/adoptopenjdk.list
# apt-get update
# apt-get install adoptopenjdk-11-hotspot

という感じで簡単にインストールできる。

$ java -version
 openjdk version "11.0.3" 2019-04-16
 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
 OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

デフォルトが変わらないようであれば

# update-alternatives --config java

をして切り替える。

Python 3.7のインストールに失敗するときに

Ubunut 18.04にpyenvで以下のような感じでPython 3.7のインストールに失敗するときには

$ pyenv install 3.7.3
 Downloading Python-3.7.3.tar.xz…
 -> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
 Installing Python-3.7.3…
 BUILD FAILED (Ubuntu 18.04 using python-build 1.2.11-11-g7dd50144)
 Inspect or clean up the working tree at /tmp/python-build.20190516184525.2792
 Results logged to /tmp/python-build.20190516184525.2792.log
 Last 10 log lines:
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/init.py", line 6, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/completion.py", line 6, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/base_command.py", line 20, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/download.py", line 37, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/glibc.py", line 3, in 
   File "/tmp/python-build.20190516184525.2792/Python-3.7.3/Lib/ctypes/init.py", line 7, in 
     from _ctypes import Union, Structure, Array
 ModuleNotFoundError: No module named '_ctypes'
 Makefile:1130: recipe for target 'install' failed
 make: *** [install] Error 1

以下のような感じで、libffi-devを入れておく。

$ sudo apt install libffi-dev

Fess 13のリリース

Fess 13はElasticsearch 7に対応するメジャーアップデートリリースになります。ということで、使い勝手のUI的なところはほとんど変わっていない気がしますが、中身の仕組み的なところはいろいろと変更が入っています。

Transport 通信の廃止

Fess 13からは9300などでのTransportによる通信はしません。HTTPで9200などでElasticsearchと通信するようになりました。Fess 12まではダッシュボードはHTTPで通信して、その他がTransportを使っていました。ElasticsearchがTransportでの外部からの接続はやめるとのことなので、Fess 13からはすべてをHTTPで通信するようになりました。

ソースコード的には、さすがにHTTPへの書き換え作業をすると絶望的なコード量なので、elasticsearch-clientというのを作り、TransportClientを使っている部分はそのままで動くようなライブラリを作り対応しました。これにより、今までどおりの使い方で、HTTPとしてElasticsearchと通信できるようになりました。

Java 11対応

Java 11対応というよりはJava 8を捨てました。Elasticsearch 7はまだJava 8もサポートしていると思いますが、Fessを利用する顧客からJava 8指定で要求されることがないですし、サポート対象を減らしたほうがメンテが楽なので、Fess 13からJava 8をやめました。Lucene自体もMR Jarだったりするので、Java 11を使ったほうがパフォーマンス向上を期待できる部分もあると思うので。

これにあわせて、G1GCをデフォルトで使うようにしてあります。チューニングはしたものの、8GBメモリ以下くらいの環境だと、まだOOMが出る場合もあるかもしれないので、引き続き微調整していく必要があると考えています。それ以上メモリが使えるなら、ヒープへの割り当てを増やせば特に問題はないと思います。

JavaScriptエンジン

Java 11では、Nashornを使っていると、将来のリリースではなくなるよー、という感じのメッセージが出ます…。とはいえ、Fess(というか、Lasta DI)ではJavaScriptエンジンが必要あり、なんとかする必要があったので、FessではNashornをフォークしたsaiを作りました。ということで、Fess 13からは利用するJavaScriptエンジンを変更しています。

ラベルの指定方法

Fess 12まではクロール設定でクロール設定単位でのラベルの設定ができたのですが、この設定方法は利用者を混乱させていました。ということで、ラベルの指定方法はラベルの設定で正規表現で指定することでクロール時にラベルが付加されるように一本化しました。

言語判定

Fess 12まではElasticsearch側にlangfieldプラグインを入れることで、言語情報の付加を行っていました。Elasticsearch側で言語判定を行う場合、できることも限られているため、柔軟な言語判定処理ができるようにするためにFess側で言語判定処理を行うようにしました。そのため、Fess 13からはlangfieldプラグインが不要になりました。

以上のような感じの見た目ではわからないような大きな変更が入っているかと思います。今後も、ドキュメント管理機能やrank_featuresによるスコア最適化など、新しい機能も考えています。まだまだチャレンジは続くと思うので、ぜひ、Fess 13を使ってみてください。