Fess 13.1のリリース

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

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

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

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

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を使ってみてください。

Fessでrobots.txtなどを参照する設定

Fessのウェブクロール設定でrobots.txtを参照するしないを指定する設定はパラメータ欄に

client.robotsTxtEnabled=true

で、metaタグのrobotsを参照するしないを指定する設定はパラメータ欄に

config.ignore.robots.tags=false

としておく。上記は個別設定ですが、デフォルトを設定しておくにはfess_config.propertiesの以下を変更する。

crawler.ignore.robots.txt=false
crawler.ignore.robots.tags=false

FessのAzure AD対応

Fess 12.6からAzure ADの認証に対応する予定。対応するためにadal4jを利用したので、OpenID Connectによる認証になる。これに合わせて、SSOまわりの実装をいろいろと変更したので、12.5に入れるには大きな変更になったので、12.6にいれることにした。

実装するにあたり、active-directory-java-webapp-openidconnectというサンプルプロジェクトを参考にしながら作ったのだけど、このサンプルが所々にゴミが残っていたり、コピペ的に作ると痛い目を見る感じだったので、読み解きつつ、リファクタリングして、Fessには取り込んでおいた。

ということで、Azure PortalでAzure ADにアプリ登録をして、system.propertiesに以下を記述することで、Fessでhttp://localhost:8080/sso/にアクセスすると、Azure ADに認証に行ってFessでログイン状態にすることができるようになる。

sso.type=aad
aad.tenant=<tenant_name>.onmicrosoft.com
aad.client.id=...
aad.client.secret=...

sso.typeは以前のバージョンではfess_config.propertiesで設定していたけど、system.propertiesに移すことで、設定がオンラインで変更可能になった。

Fess 13に向けて

Fess 13ではElasticsearch 7系を採用する予定だけど、Elasticsearch 6から7への変更はBreaking changesに書いてある。まだ、7.0.0-beta1がリリースされている段階だが、Elasticsearch 6のときにはrc1がリリースされた頃からFess 12に対応したため、ちょっと時間がかかったりで、6.1がリリースされたときにFess 12.0がリリースされたので、Elasticsearchとはマイナーバージョンがずれる感じになってしまった。ということで、今回はちょっと早めのbeta1から対応を始めている。

とはいえ、Breaking changesにあるように変更はいろいろとある。今回はFessで遭遇した変更点を上げておく

typeの削除が始まる

Elasticsearch 8で完全になくなると思うが、7では消し始めていかないとエラーになったりする箇所がある。なので、使っていれば積極的に消していく必要がある。Java APIとかだと、client.prepareDelete(index, type, id)みたいに指定できてしまう箇所とかもあるけど、これらはclient.prepareDelete().setIndex(index).setId(id) みたいにtypeを消したりとどんど消していったほうが良い。_docとかをtypeに指定しておけば良いかもしれないが、修正漏れとか出たりするので思い切って消す方針で進めるのが良いかも。

hits.totalがオブジェクトになる

ここにあるように、件数が整数で返ってきたのがオブジェクトになるので、JSONのパースとかしている箇所では注意が必要。オブジェクトになったことに合わせて、track_total_hitsなど、件数表示の指定などがあったり、件数の考え方に確認しておく必要がある。

Transport Clientは非推奨

Elasticsearchとの通信にはHTTP(9200)とTransport(9300)の2種類があったが、Transportの方は非推奨になっている。8では削除される。なので、TransportClientは利用せず、HTTPでElasticsearchと通信するようにしておくのが良い。Fessでは普通にRESTに書き直すのは変更が大きすぎてつらすぎるため、elasticsearch-httpclientを作成して、TransportClientを単純置き換えで、移行した。

楽観的排他制御の変更

_versionでoptimistic concurrency controlを実装していたが、(たぶん)Elasticsearch 6の後半あたりで、_seq_noと_primary_termを利用するように変更されている。Elasticsearch 7では_seq_noと_primary_termを利用する必要があるので、これに置き換える必要がある。

スクロールのコンテキストの上限

スクロールで検索するとサーチコンテキストがオープンされるのだが、search.max_open_scroll_contextが500に設定され、オープンするコンテキストの上限が500になった。今までは上限なしだった。というわけで、スクロール検索している箇所では、スクロールの終了時にはscroll_idは削除しないと、指定時間だけ保持されることになり、上限になってエラーになる。サーチコンテキストは不要なら明示的に削除していく必要がある。

というあたりのところが、Fessでは問題なった箇所かな…。Elasticsearch 7とは関係なく、言語判定部分などみなしたい箇所があるので、fessインデックスのマッピングなどは見直すことになると思います。Elasticsearch 7が出た後の近いうちにはFess 13をリリースできるようにしたいところではありますね。