Fess 14.16のリリース

Fess 14.16をリリースしました。細々としたことをいろいろと対応しました。

#2837では、管理画面のデザインでセキュリティ面を考慮して、スクリプトレットを記述できないようにしておきました。

#2835 は、プラグインなどから、検索前にリクエストパラメーターを書き換えたりできるようなインターフェースの追加を行いました。セマンティックサーチのプラグインで必要だったので、機能を追加しました。

#2834 は管理APIで直接ドキュメントをインデクシングしたときに、言語判定を処理できるかを調整しました。通常は、langフィールドの値に基づいて処理しますが、言語判定をしたい場合は、lang=autoを指定することで、contentの内容を元にして、langの値などが設定されるようになります。

#2833 は、管理APIにバルクでドキュメントをインデクシングできるエンドポイントを用意しました。今までも1件ずつであれば、管理APIから直接インデクシングができましたが、複数件まとめて、ドキュメント群をインデクシングすることができるようになりました。クローラーを利用せずに、インデクシングをしたい場合などに効率的にインデックスを作成できます。

#2832 は複数の検索語を入れて検索して、ヒット件数が0件のときにOR検索として、再検索する機能になります。

#2831は検索APIのレスポンスにスコアが入ってなかったので含めるようにしました。

#2830は検索ログの登録時に、1分間あたりに大量にあると処理できない場合があるので、検索ログをバルクで処理するようにしました。

#2829はRank Fusion関連の設定値が定期的に反映されるようにしました。

#2828は、検索のクエリーに関して、内部的にboolクエリーを組み立てて処理していましたが、DisMaxでもクエリーを構築できるようにしました。将来的に、dismaxを利用するのかは、今後、定量的に評価して検討していく予定です。

#2827 は管理画面の検索ログ系インデックスからのデータをダウンロードする際に、CPU負荷を考慮するようにしました。

#2826は、ドキュメントのキャッシュ表示の有無など、各種設定を細かく設定できるようにしました。

という感じになりますが、今回は、セマンティックサーチの改善と検索品質評価ベンチマークの利用の観点で、必要な修正を入れた感じになります。

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

FessにバルクAPIを追加

管理APIを使えば、ドキュメントを直接追加とかは今までもできるのだけど、beir-fessで、1件ずつの追加とかだと時間がかかりすぎて、ドキュメントサイズが大きいものだと厳しすぎる…ということで、管理APIに複数件を追加できるエンドポイントを追加しました。

使い方は、/api/admin/documents/bulkにPOSTで以下のように投げる感じです。

$ curl -XPOST -H "Content-Type:application/json" -H "Authorization: <ACCESSTOKEN>" "localhost:8080/api/admin/documents/bulk" -d '{
"documents": [
{
"lang": "en",
"title": "Test 1",
"content": "Test Message 1",
"content_length": 15,
"url": "http://www.codelibs.org/1.html",
"host": "www.codelibs.org",
"site": "www.codelibs.org/1.html",
"filename": "1.html",
"mimetype": "text/plain",
"filetype": "text",
"click_count": 0,
"favorite_count": 0,
"boost": 1.0,
"last_modified": "1970-01-01T00:00:00.000Z",
"timestamp": "1970-01-01T00:00:00.000Z",
"created": "1970-01-01T00:00:00.000Z",
"role": ["Rguest"]
},
{
"title": "Test 2",
"content": "Test Message 2",
"url": "http://www.codelibs.org/2.html"
}
]
}'

アクセストークンは、管理画面からアクセストークンを{role}admin-apiのパーミッションで生成します。

documentsに配列でドキュメントを渡します。urlやtitleなど、必須のフィールドもあります。langフィールドにautoを指定すると、言語判定が行われて、言語用フィールドが追加されます。明示的にlangフィールドを指定していれば、その言語で言語フィールドがインデクシングされます。

レスポンスは以下のように返ってきます。更新であれば、resultはOKになり、失敗していれば、エラーメッセージが含まれます。追加前にバリデーションに引っかかれば、追加せずにエラーが返ってきます。

{
"response": {
"items": [
{
"result": "CREATED",
"id": "c7c345e44bc421a66addde52c80d..."
},
{
"result": "CREATED",
"id": "07929a1cb024b771e1b65b5f6696..."
}
],
"version": "14.16",
"status": 0
}
}%

という感じで、Fessにドキュメントを効率よく直接追加する手段として利用してみてください。

BEIRをFessで実行する

BEIRは検索関連のデータセットを実行して、精度評価とかできるようなベンチマークツールみたいなものですが、Fessも検索品質を定量的に改善していけると良いなーと思い始め、BEIRをノートブックで簡単に実行できるようにcodelibs/beir-fessを作ってみました。

BEIRのサンプルには、BM25で試したりすることはできるので、同じような感じで、Fessにもインデクシングと検索ができるようにしました。一応、BEIR-fess.ipynbを実行すると、FessをDockerで起動して、インデクシング、検索、Dockerを終了、という感じで一連の処理をしてくれます。なので、簡単に実行はできると思います。

今回、BEIRで実行できるように、Fess自体にも修正を入れたので、次のFessのリリースには反映されていると思います。BEIRの検索クエリーは、単語でなく、質問文みたいな感じなので、これをFessにそのまま渡すと、単語のAND検索になるので、全くヒットしないのです…。なので、今回、ゼロ件ヒットのときには、OR検索にして、再度投げるという感じの処理を入れてます。この辺は将来的には、改善の余地がありそうではありますが…。

あとは、検索クエリーが質問文なので、Fessのセマンティック検索版とかもBEIRで試せるようにする必要はあるかなとは考えてます。

そんな感じで、定量的な評価ができるようになると良いなと思います。