このドキュメントでは、ログインしたユーザーが自分のタグを管理し、ドキュメントに付ける Fess の v2 タグ API について説明します。共通のレスポンスエンベロープ・エラーモデル・CSRF については APIの概要 を参照してください。
ベースURLは http://<Server Name>/api/v2/ です(ローカル環境の例: http://localhost:8080/api/v2 )。
注釈
タグ機能はデフォルトで無効です。利用するには fess_config.properties で user.tag.enabled=true を設定してください。 /api/v2/ui/config の features.user_tag で状態を確認できます。無効な間は、CSRF・Origin の検証を通過し、許可された HTTP メソッドを使うリクエストに対して、タグ API は invalid_request (400) を返します。
タグの仕組み
タグはユーザーごとに管理されます。タグを作成したユーザーがそのタグの所有者です。所有者はログインユーザー ID です。同じ名前のタグでも、所有者が違えば別のタグです。
タグを使えるのはログインしたユーザーだけです。すべてのタグ API はセッションのログインユーザーとして動作し、アクセストークンはログインの代わりになりません。ログインしていない呼び出し元は
auth_required(401) になります。タグは作成時には非公開で、所有者だけが見られます。所有者がタグを「共有」にすると、ログインしたすべてのユーザーがそのタグを見て、絞り込みに使えるようになります。ログインしていないユーザーには、共有タグも見えません。
タグを変更、削除、ドキュメントに付け外しできるのは所有者だけです。他のユーザーの共有タグは表示と絞り込みにだけ使えます。管理者は管理画面ですべてのタグを管理できます( タグ を参照)。
タグはドキュメントの URL に付きます。同じ URL を持つインデックス上のすべてのドキュメントにタグが付きます。ただし、仮想ホストを持つタグは、その仮想ホストを持つクロール設定のドキュメントにだけ付きます。同じ URL を 2 つの仮想ホストでクロールした場合は 2 つのドキュメントになります。仮想ホストを持たないタグと、仮想ホストを持たないドキュメントは、これまでどおりです(後述の「仮想ホスト」を参照)。
各タグには次の識別子があります。
valueタグの値です。
base64url(名前):base64url(所有者)(パディングなし、UTF-8)の形式で、インデックスのtagフィールドに格納されます。検索の絞り込みに使う不透明な値として扱ってください。idタグ ID です。
valueの SHA-256 を小文字の 16 進数で表した 64 文字の文字列です。/api/v2/tags/{tagId}などのパスに指定します。名前を変更するとvalueとidの両方が変わります。
タグ名は NFKC で正規化され、連続する空白は 1 つにまとめられ、前後の空白は取り除かれます。正規化後の長さは 1 〜 user.tag.name.max.length (デフォルト: 50 )文字で、制御文字や書式文字(ゼロ幅文字や双方向の上書きなど)を含む名前は拒否されます。
仮想ホスト
仮想ホストを設定している場合、タグはタグのファセットと同じく、リクエストの仮想ホストに従います。
タグには、作成したリクエストの仮想ホストが記録されます。
仮想ホストに一致したリクエストでは、
GET /api/v2/tagsとドキュメントのタグ API のaddableに、その仮想ホストの呼び出し元のタグだけが返ります。他の仮想ホストのタグや、仮想ホストを持たないタグは返りません。そのタグの名前の変更、削除、idを指定したドキュメントへの追加はnot_found(404) になり、nameを指定したドキュメントへの追加はconflict(409) になります。1 人のユーザーは、仮想ホストをまたいで同じ名前のタグを 1 つしか持てないためです。仮想ホストに一致しないリクエストには、すべてのタグが見えます。仮想ホストを持つタグは、そのドキュメントのクロール設定に同じ仮想ホストが設定されている場合にだけ、ドキュメントに付きます。ドキュメントを再度インデックスするとき、
tag_updaterジョブの実行時、ドキュメントにタグを付けるときに適用されます。仮想ホストを持たないタグと、仮想ホストを持たないドキュメントは制限されません。管理者は、タグタイプの管理画面で、タグの仮想ホストを変更したり、タグを削除したりできます( タグ を参照)。
検索での利用
user.tag.enabled が true の間、検索 API( /api/v2/search )は次のようにタグを扱います。
各ヒットに、呼び出し元に見えるタグを
tagsとして返します。各要素はvalue、name、owner、mine(呼び出し元が所有者ならtrue)、shared(共有タグならtrue)です。見えるタグがなければtagsは返りません。インデックスのtagフィールドそのものは返りません。facet.field=tagを指定すると、facet_fieldに呼び出し元に見えるタグだけのファセットが返ります。各バケットにはvalueとcountに加えて、label(タグ名)、owner、mine、sharedが付きます。fields.tag=<value>で、タグの付いたドキュメントに絞り込めます。値にはヒットのtagsまたはファセットのvalueをそのまま指定します。
タグを指定する条件( fields.tag 、 tag: 、 ex_q 、 facet.query )は、呼び出し元に見えるタグの値との完全一致だけが有効です。見えないタグの値や、ワイルドカード・前方一致・あいまい・範囲の条件は何にも一致しません。ログインしていない呼び出し元には、タグもタグのファセットも返らず、タグの条件は何にも一致しません。
タグの値には : が含まれるため、クエリーでは引用符で囲んでください。 q=tag:"<value>" は使えますが、引用符なしの q=tag:<value> は何にも一致せず、 ex_q=tag:<value> は HTTP 400 で拒否されます。
1 人のユーザーに見えるタグは、自分のタグを優先して最大 user.tag.visible.max.size (デフォルト: 1000 )個です。これを超えたタグは、ヒットの tags とファセットには現れません(絞り込みには使えます)。
ドキュメントへの反映
タグの作成・変更・削除とドキュメントへの付け外しは、タグ API にはすぐに反映されます。一方、インデックスのドキュメントの tag フィールドは、変更をメモリ上のキューに入れ、1 分ごとに実行される「Log Aggregator」( log_aggregator )ジョブがまとめて更新します。そのため、検索結果のヒットやファセット、絞り込みに反映されるまで最大 1 分ほどかかります。名前を変更したタグは、次にキューが処理されるまで、ドキュメント上の古い値が見えないため検索結果に表示されません。
キューの扱いとジョブについては タグ を参照してください。
タグ一覧の取得
リクエスト
| HTTPメソッド | GET |
| エンドポイント | /api/v2/tags |
呼び出し元が所有するタグを、表示順序と名前の順に返します。他のユーザーの共有タグは含まれません。
レスポンス
成功時(200)は、共通エンベロープの response 直下に以下のフィールドが返ります。
tags | 呼び出し元のタグの配列。各要素は id 、 value 、 name 、 shared (共有タグなら true )、 sort_order (表示順序)、 path_count (タグを付けた URL の数)。 |
表: レスポンスフィールド
タグの作成
リクエスト
| HTTPメソッド | POST |
| エンドポイント | /api/v2/tags |
呼び出し元のタグを作成します。状態を変更するリクエストのため、 X-Fess-CSRF-Token ヘッダーが必要です( APIの概要 を参照)。
1 人のユーザーが持てるタグは最大
user.tag.max.tags(デフォルト:1000)個です。超える場合はinvalid_request(400) になります。呼び出し元が同じ名前のタグをすでに持っている場合は
conflict(409) になります。他のユーザーが同じ名前のタグを持っていても作成できます。
リクエストボディは Content-Type: application/json で、最大サイズは 1 KiB(1024 バイト)です。
表: リクエストボディ
レスポンス
成功時(200)は、 response 直下の tag に作成したタグ( GET /api/v2/tags の要素と同じ形式、 path_count は 0 )が返ります。
タグの変更
リクエスト
| HTTPメソッド | PUT |
| エンドポイント | /api/v2/tags/{tagId} |
呼び出し元のタグの名前の変更と、共有の切り替えを行います。 X-Fess-CSRF-Token ヘッダーが必要です。
リクエストボディには
nameとsharedの少なくとも一方を指定します。nameで名前を変更すると、タグのidとvalueが新しくなります。古い値を持つドキュメントは、次にキューが処理されたときに新しい値に置き換わります。呼び出し元がすでに使っている名前に変更しようとするとconflict(409) になり、タグは変更されません。sharedは、タグを見られるユーザーだけを変えます。ドキュメントの更新は不要です。sharedをfalseにしても、管理者がパーミッションに追加したロールやグループはそのまま残ります。他のユーザーの共有タグは
forbidden(403)、呼び出し元に見えないタグはnot_found(404) になります。他の更新と競合して書き込みに繰り返し失敗した場合も
conflict(409) になります。
成功時(200)は、 response 直下に tag (変更後のタグ)と renamed (名前を変更した場合 true 。このとき tag.id と tag.value は新しい値)が返ります。
タグの削除
リクエスト
| HTTPメソッド | DELETE |
| エンドポイント | /api/v2/tags/{tagId} |
呼び出し元のタグを削除します。ドキュメントからは、次にキューが処理されたときにタグの値が取り除かれます。 X-Fess-CSRF-Token ヘッダーが必要です。他のユーザーの共有タグは forbidden (403)、呼び出し元に見えないタグは not_found (404) になります。
成功時(200)は、 response 直下に id (削除したタグ ID)と deleted (常に true )が返ります。
ドキュメントのタグの取得
リクエスト
| HTTPメソッド | GET |
| エンドポイント | /api/v2/documents/{docId}/tags |
ドキュメントの URL に付いているタグのうち呼び出し元に見えるものと、まだ付いていない呼び出し元のタグを返します。ドキュメントは呼び出し元のロールで検索されるため、呼び出し元が検索できないドキュメントは not_found (404) になります。
レスポンス
成功時(200)は、共通エンベロープの response 直下に以下のフィールドが返ります。
表: レスポンスフィールド
ドキュメントへのタグの追加
リクエスト
| HTTPメソッド | POST |
| エンドポイント | /api/v2/documents/{docId}/tags |
ドキュメントの URL を呼び出し元のタグに追加します。 X-Fess-CSRF-Token ヘッダーが必要です。
リクエストボディ( Content-Type: application/json 、最大 1 KiB)では、 id で既存のタグを指定するか、 name でタグ名を指定します。両方を指定した場合は id が優先されます。
nameを指定し、呼び出し元がその名前のタグを持っていない場合は、非公開のタグを作成して付けます。作成したタグはuser.tag.max.tagsに数えられます。1 つのタグを付けられる URL は最大
user.tag.max.paths(デフォルト:10000)個です。超える場合はinvalid_request(400) になります。他のユーザーのタグを
idで指定すると、そのタグが見える場合はforbidden(403)、見えない場合はnot_found(404) になります。成功時は、ドキュメントのタグの取得と同じフィールドに
addedとtagを加えて返します。タグは API 上ではすぐに付きますが、その URL のドキュメントの検索結果に反映されるのは、次にキューが処理されたとき(1 分ほど後)です。
ドキュメントからのタグの削除
リクエスト
| HTTPメソッド | DELETE |
| エンドポイント | /api/v2/documents/{docId}/tags/{tagId} |
ドキュメントの URL を、 tagId で指定した呼び出し元のタグから取り除きます。 X-Fess-CSRF-Token ヘッダーが必要です。他のユーザーのタグは、見える場合は forbidden (403)、見えない場合は not_found (404) になります。成功時は、ドキュメントのタグの取得と同じフィールドに removed を加えて返します。
エラーレスポンス
エラーモデルの詳細は APIの概要 を参照してください。タグ API が返す HTTP ステータスは以下の通りです。
表: エラーレスポンス
設定
fess_config.properties の次の設定でタグ機能を調整できます。
| プロパティ | 説明 | デフォルト |
|---|---|---|
user.tag.enabled | ログインしたユーザーがタグを使えるかどうか。 | false |
user.tag.name.max.length | タグ名の最大文字数(コードポイント数)。 | 50 |
user.tag.max.tags | 1 人のユーザーが持てるタグの最大数。 | 1000 |
user.tag.max.paths | 1 つのタグを付けられる URL の最大数。 | 10000 |
user.tag.queue.max.size | ドキュメントに反映されるまでメモリ上に保持する変更の最大数。超えた変更は破棄され、WARN ログが出力されます。 | 10000 |
user.tag.process.batch.size | 変更をドキュメントに反映するときに、1 回のバルクリクエストで更新する URL の数。 | 100 |
user.tag.visible.max.size | 検索で 1 人のユーザーに見えるタグの最大数。 | 1000 |