Fessのセマンティックサーチ

semantic.codelibs.orgにデモサイトを作ってみた。この手のを作って、実験していかないと改善もできないですし。

仕組み的には、docker-semanticsearchにあるものを動かしている感じです。セットアップ手順とかはそこに書いてあるとおりで、Fessにfess-webapp-semantic-searchプラグインを入れて、動かしています。

インデクシングについては、検索対象は、英語のWikipediaのコンテンツ部分を抜き出して、単純なHTMLにして、それをインデックスしています。HTMLなので、普通にウェブクロールしている感じです。

検索については、通常の転置インデックスに対する検索とベクトル検索のハイブリットサーチになっています。ベクトル検索は、OpenSearchのNeural Queryを投げて、ANNで検索してます。なので、通常の検索の検索結果と、ANNで返ってくるTop Kの検索結果をReciprocal Rank Fusion(RRF)でマージして、検索結果を表示してます。RRF自体は、Fessで実装してます。通常のFessの検索画面だと、ベクトル検索の結果がどれなのかがわかりにくいので、ベクトル検索結果はロボットアイコンが表示されてます。人っぽいアイコンの方は通常の検索結果のものです。なので、ページングしていくと、通常の検索結果だけになるのがわかると思います。

RRFの実装自体はページングを考えなければ、シンプルなので、ベクトル検索に限らず、複数の検索結果をマージできるようにFessでは汎用的に実装してあります。現時点では、ファセット表示のところに、ベクトル検索の集計結果がカウントされないという、制限事項はありますが…。

ベクトル検索の結果については、embeddingの質とかもあるので、まだまだ改善の余地はある印象があります。このデモサイトを使ってみて、見つける課題とかもあるので、地道に改善していこうと思っています。

JSON形式のログを変換する

FessをDockerで動かすと、ECS形式のJSONとして、ログが出力されます。人がパッと見て理解はしにくいので、ただのログファイルのように変換するには、jqを利用して、変換すると見やすくなると思います。

cat fess-crawler.log | jq -r '."@timestamp" + " " + ."log.level" + " " + .message' 

Fess 14.10.0のリリース

Fess 14.10.0をリリースしました。Fessとしては、特に大きな変更はないのですが、OpenSearch 2.9でmapping char filterが辞書ファイルに#で始まるコメントを許可しないという破壊的な変更が入っているため、OpenSearchをアップグレードする際には注意が必要になります。Fessで利用しているmapping.txtで、#の行を削除しないと、fessインデックスがopenできない状態になります。

という感じですが、14.10の変更を見ていくと、

#2758はデータストアクロールで、インデクシングするURLに#を含めると、検索結果でリンクが機能しないという問題があるのを対応しました。

#2759はデータストアクロールでは設定パラメーターで指定するような値が利用できないので、パラメーターの入力されたものを利用できるようにしました。CSVリストクロールなどのときに、CrawlerClientが指定されたURLにアクセスするときのパラメーターとして渡せるようになりました。

#2760はAzureADを認証として利用して、AzureADを利用したファイルシステムのクロールするときに認証情報が異なるので、それに対応するようにしました。

#2762はFessのアップグレード処理関連の更新です。今回はmapping.txtの問題があるので、アップグレードを実行すると、mapping.txtから#〜を削除してくれる機能を追加してあります。なので、OpenSearch 2.9でfessインデックスが起動できないときには、アップグレードを実行すると、mapping.txtの問題を修正してくれます。

という感じで、OpenSearch 2.9のmapping char filterの処理が変更された問題はありますが、何かあれば、フォーラムをご利用ください。