Fessの検索APIでファセット指定の誤りを400として扱う

Fessの/api/v2/searchでファセットの数値を誤ったとき、検索結果が0件だったのか、リクエストが間違っていたのかを区別しやすくする修正を行いました。APIを利用する検索画面や連携プログラム向けの変更です。

空の検索結果からリクエストエラーへ

従来はfacet.size=abc、facet.size=0、facet.size=-1やfacet.minDocCount=xを指定すると、HTTP 200でrecord_countが0、partial=trueの応答になる場合がありました。修正後は検索を開始する前に検証し、HTTP 400のinvalid_requestとして返します。

facet.sizeは1以上の整数、facet.minDocCountは整数で指定します。facet.fieldやfacet.queryの要素数・文字列長の制限超過も、検索開始前のリクエストエラーとして扱います。

指定例と初期値

curl --get 'http://localhost:8080/api/v2/search'   --data-urlencode 'q=manual'   --data-urlencode 'facet.field=label'   --data-urlencode 'facet.size=20'   --data-urlencode 'facet.minDocCount=1'

数値を省略した場合は設定値を使います。開発版の初期値はquery.facet.fields.size=100、query.facet.fields.min_doc_count=1です。facet.sizeの上限を制御するquery.facet.fields.size.maxは1000、最小文書数の上限query.facet.fields.min_doc_count.maxは2147483647です。

上限を超える有効な数値は従来どおり上限へ調整されます。負のfacet.minDocCountも拒否する変更ではなく、検索側で0に調整されます。クライアントでは意味の分かりやすい0以上の値を指定するとよいと思います。

クライアントでの確認

HTTPステータスを確認してから検索結果を扱い、400 invalid_requestなら送信したパラメーターを見直します。特に「ファセットを出さない」という意味でfacet.size=0を送っている実装は、不要なfacet.fieldやfacet.queryを送らない形へ変更します。ファセットを要求しない場合、facet.sizeとfacet.minDocCountは読み取られません。

検索エンジンなどの障害時に空の部分的結果を返す挙動は維持されます。partial=trueを一律に入力誤りと判断しないでください。変更対象はv2 APIで、旧v1 APIや他の検索経路へ一律に適用するものではありません。num=abcやstart=abcが既定値になる挙動も今回の対象外です。

関連PR

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です