Fessの検索APIで容量不足と不完全な検索結果を見分ける

検索エンジンの容量不足を「検索式が不正」と扱っていた応答と、検索失敗時の結果を完全な0件に見せていた応答が改善されました。検索APIを利用するアプリケーションでは、HTTPステータスとpartialの両方を確認します。

容量不足は503とRetry-After

OpenSearchがHTTP 429または503で検索を拒否した場合、Fessのv2検索APIはHTTP 503、エラーコード service_unavailable、Retry-After: 5 を返すようになります。5秒は固定値で、新しい設定項目ではありません。

以前は400 invalid_requestとなり、Fessがエスケープした検索式で再試行して、余裕のないエンジンへさらに検索を送っていました。修正後は検索式の問題と切り分け、WARNにエンジンの状態と理由を記録します。呼び出し側はRetry-Afterを尊重し、再試行回数を制限します。

この扱いはエンジンから429/503の応答を受け取る場合です。接続不能などすべての障害が503になるわけではありません。旧v1 APIやWeb画面にも全く同じ応答形式が追加された変更とは扱いません。

200でもpartialを確認する

複数検索器を使うFess側の融合で、主検索器が失敗した場合も partial=true を設定するようになります。検索エンジン停止中に明示的なsortで検索すると、200・0件・partial=falseとなっていた問題を改善します。

record_count_relation=GREATER_THAN_OR_EQUAL_TO は下限を示します。partial=trueやtimed_outを見ずに、200というだけで「該当文書がない」と表示しないようにします。rank.fusion.engine.enabled のFess本体初期値はfalseですが、Dockerデモがtrueを指定する場合もあります。明示sortや高度検索など、エンジン側の融合を使わない条件にも注意します。

不正な num=0 や start=-1 は検索器を実行する前に検証します。これらの400 invalid_requestという応答は従来どおりで、利用者の入力ミスを検索器の障害としてログに積むことを避ける内部改善です。

Dockerのメモリー設定を確認する

docker-filesearchの文書には、parent circuit breakerの容量不足に対する調査手順が追加されました。初期値のヒープは2gのままです。連続検索の高負荷試験では4gで拒否が解消したため、環境のメモリー余力を確認し、必要なら .env に OPENSEARCH_HEAP=4g を設定して docker compose up -d search01 で反映します。

3gでも試験条件によっては拒否が残り、4gでもどんな負荷にも対応できる保証ではありません。OpenSearch再起動後はモデルの再読み込みがあり、最大1分程度キーワード検索だけになることがあります。閾値やクエリーを変える前に、ログ、ヒープ、モデル状態を確認してください。

関連PR

Fess管理画面のEnter操作と入力エラー表示を改善する

Fessの管理画面で、入力欄のEnterを押すと保存せず一覧へ戻る、入力エラーの項目名や文章が画面と異なる、といった問題を修正しました。キーボード操作、入力検証、存在しないデータからの復帰に関する変更をまとめて紹介します。

Enterでフォームの主操作を実行する

一覧の検索欄では検索、新規作成・編集フォームでは利用可能な主ボタンをクリックする動作になりました。以前はJavaScriptのエラー後、ブラウザがフォームの先頭にある「戻る」を実行し、入力内容を保存せず画面が変わる場合がありました。

Tabで一覧行へフォーカスを移し、EnterまたはSpaceを押すと詳細画面を開けます。行内のリンクやボタンにフォーカスがある場合は、そのコントロール自身の操作を優先します。ファイル入力やボタンのEnterも専用の動作を維持します。

利用可能な主ボタンがないフォームではEnterを抑止します。全般設定を含め、すべての画面でEnterが保存になるわけではありません。日本語入力の変換確定は、変換中と判定できるイベントではIMEへ渡します。保存前に画面の主ボタンを確認してください。

入力エラーを画面の言語で読む

必須入力などの検証メッセージへ、所有者、SSO、通知、辞書、メンテナンスなど112項目のラベルを追加しました。ownerなど内部の項目名の代わりに、画面と対応する名前で問題を把握できます。文の言語が起動後最初にエラーを出した利用者の言語に固定される問題も修正し、各リクエストの言語で文章を解決します。

アイコンだけの検索ボタンにも読み上げ用の名前を付け、ダイアログの閉じるボタンを画面の言語へ合わせています。この変更だけでページャーの状態表示、見出し階層、各エラーと入力欄の関連付けまで全面的に改善されるわけではありません。

削除済みデータと深いページから復帰する

対象の詳細・複製画面で存在しないIDを開いた場合、システムエラーではなく一覧と「見つからない」旨のメッセージを返します。検索エンジンを使う一覧は結果ウィンドウ内の最終ページへ丸めます。indexer.max.result.window.sizeの初期値は10000で、この変更が上限を増やすわけではありません。

辞書の一覧はファイルを読むためページ上限の処理対象外です。ストレージ画面の任意パスに大きな数字を付ける操作など、すべての異常URLを復帰させる修正でもありません。

新しい有効化設定はありません。修正を含む本体へ更新し、管理画面へログインする権限がある利用者が使います。更新後は、一覧の検索、検証用フォームの必須項目エラー、削除済みIDへのアクセスを確認すると、日常操作の改善を把握できます。

関連PR

FessのDropboxクロールをHTTPプロキシ経由で実行する

社内ネットワークからDropboxへの直接通信を許可せず、HTTPプロキシを経由させたい場合に使える設定がDropboxデータストアへ追加されました。あわせて、DropboxとDropbox Paperのクロール終了待ちや失敗通知も改善されています。

対応状況

関連PRはマージ済みです。ただし、今回の変更を含むプラグインの公開バージョンは未確認です。Fess本体の最新公開リリースは確認時点で15.8.0であり、本記事は開発中の変更を説明します。利用時には本体と互換性のある、修正を含んだDropboxプラグインが必要です。

プロキシの設定

DropboxまたはDropbox Paperのデータストア設定に、既存のアクセストークンなどのパラメーターとともに次を追加します。

proxy_host=proxy.example.com
proxy_port=8080

proxy_hostの初期値は空で、未指定または空の場合は直接接続します。ホストを指定する場合はproxy_portも必要です。ポート未指定や数値に変換できない値はエラーになります。HTTPプロキシを通じたHTTPS通信ではCONNECTを許可する必要があります。

Dropbox SDKの既定通信処理はJVMのhttps.proxyHost・https.proxyPortを使用しないため、JVMの起動オプションだけを設定しても、このデータストアの接続先は変わりません。今回追加されたパラメーターを使います。

この設定はBasicクライアントとTeamクライアントで共通です。basic_planの初期値はfalseで、Basicプランを対象にする場合はtrueを設定します。proxy_username・proxy_passwordによるプロキシ認証は今回の対応に含まれません。

空のクロールと失敗を確認しやすくする

修正前は、処理対象が空でも終了待ちが毎回60秒続いていました。修正後はタスク受付を終了してから待機するため、処理が終われば早く戻れます。投入済み処理を待つ上限の60秒は変わりません。

Dropbox Paperでは、チームメンバーの一覧取得が失敗した場合にデータストア例外として報告します。個別メンバーの取得失敗はWARNに記録し、他のメンバーの処理を続けます。ネットワーク不通や無効なトークンで「遅いが成功したクロール」に見える状態を切り分けやすくなります。

導入後はプロキシのCONNECT記録、Fessのクロールログ、取得件数を確認してください。プロキシ経由の疎通ができても、Dropbox側の権限やトークンの有効性は別途必要です。

関連PR