Fess 14.15のリリース

OpenSearch 2.15がリリースされていたので、Fess 14.15もリリースしました。今回は、細々とした改善を入れました。

#2824は、ldap.lowercase.permission.name=trueのときには、SMBでクロールしたもので取得したロール名も小文字にするようにしました。

#2823 は障害URLとして、出力した際には、fess-crawler.logには障害URLのIDを出力するようにしました。障害URLに保存しているけど、ログファイル上はINFOとかでサラッと出力されて、ぱっとみでわかりにくかったためです。

#2822 はシステムプロパティの値をクローラーなどのジョブにも渡るようにしました。今回のリリースから、ベクトルによる画像検索に対応しようと思っているのですが、この辺のことができないとベクトルのインデクシングができなかったためです。

#2821 はファイルから取得したデータをインデクシングするためのメタデータのパラメータ名で値を引き回せるようにしました。これができるようにあることで、画像ファイルからベクトルを取得して、ベクトルをメタデータとして、インデクシングまで持っていけるようになります。

#2820 は、SMBv3対応などをしていて、smb3://〜みたいなプロトコルを追加したいと思ったときに、内部処理で使える場合には自動で認識させるみたいな処理をしたかったので、機能を追加しました。

#2819 も上記と同じ話で、処理部分です。

#2818 は、fess-crawler-*みたいなプラグインとして、認識できるように修正しました。

#2817 はsite_pathの省略の設定を設定ファイルでできるようにしました。

という感じで、今回は、issueの説明を書いてみました。Fessは依存ライブラリも多いのですが、それらの話は含んでいないので、依存ライブラリの更新もいろいろとあると思います。

何かあれば、フォーラムをご利用ください。

Fessで画像検索

そのうち、やりたいなーと思っていた画像検索の機能をプラグインとして作ってみました。

fess-webapp-multimodalプラグインにその機能をまとめましたが、マルチモーダルということで、最終的には画像に限らず、音声や動画も対象にできれば、良いなぁという感じで、そのような名前にしてあります。現時点では、画像しか対象にできていませんが。

画像検索については、CLIPにより、テキストと画像の埋め込みベクトルを作成して、OpenSearchでベクトル検索する感じになっています。

CLIPは、OpenAIが開発したモデルで、テキストと画像の関係を学習するために使用されます。具体的には、テキストと画像のペアを大量に学習することで、画像の内容をテキストで表現したり、テキストに基づいて関連する画像を検索することができます。これにより、テキストと画像の間の意味的な類似性を理解し、それぞれの意味で一致するものを検索できるので、このプラグインで利用しています。

Open Images Datasetの画像を利用して、試してますが、red carとかで検索すれば、赤い車がヒットしますし、running dogとかだと走っている犬の画像がヒットするので、期待通りな感じでした。(始めに間違って、距離計算をL2にしていたら、微妙な感じで焦りましたが、コサイン類似度に変えたらいい感じになった)

今回の実装は、Fess 14.15に依存している部分があるので、次のリリースで、docker-multimodalsearchみたいな感じで、まとめようかと思います。(Fessのセマンティックサーチのdocker-semanticsearchみたいな感じで)

semantic.codelibs.orgの更新

Fessのセマンティックサーチのでも環境として、semantic.codelibs.orgを公開していましたが、久々に最新化してみました。

今回の更新で、利用するモデルも見直しました。以前は、multi-qa-mpnet-base-dot-v1を使っていて、日本語での検索がイマイチだなぁと思っていたけど、このモデルはマルチリンガルだけど、日本語が入っていなかったっぽい…。ということで、今回、paraphrase-multilingual-MiniLM-L12-v2にモデルを変えて、構築し直しました。

検索結果で、人っぽいアイコンがついた結果がテキスト検索で、ロボットっぽいアイコンがベクトル検索の結果になります。日本語でいくつか検索してみると、ベクトル検索でもそれっぽい結果が返ってくるので、そこそこ良い感じになった気がします。

ということで、Fessでセマンティックサーチを試してみたい方は、docker-semanticsearchを参照してみてください。