メタデータフィルタリングは、メタデータに基づいて検索結果を絞り込み、関連するコンテンツだけを取得します。フィルターは取得の前に適用されるため、必要なドキュメントだけをクエリします。
フィルタリングは、インデックス時に抽出したメタデータ属性を使います。カスタム属性の定義や組み込みメタデータ属性の使い方は、メタデータ属性 を参照してください。
AI Search は、フィルター可能なプレフィックスより長い文字列値を保存できます。フィルターが照合するのは、インデックス済み文字列の先頭 64 UTF-8 バイトだけです。Vectorize は文字列配列を保存できますが、現時点では配列のインデックスやフィルターはできません。
Workers バインディング でメタデータフィルタリングを使う例です。
const instance = env.AI_SEARCH.get("my-instance");
const results = await instance.search({
messages: [{ role: "user", content: "What is Cloudflare?" }],
ai_search_options: {
retrieval: {
filters: {
folder: "docs/getting-started/",
timestamp: { $gte: 1735689600 },
},
},
},
});フィルターは JSON オブジェクトです。キーはメタデータ属性名、値はフィルター条件です。
| 演算子 | 説明 |
|---|---|
$eq |
等しい |
$ne |
等しくない |
$in |
保存済みスカラーが、候補のスカラー値のいずれかに一致する |
$nin |
保存済みスカラーが、候補のスカラー値のいずれかに一致する場合は除外する |
$lt |
より小さい |
$lte |
以下 |
$gt |
より大きい |
$gte |
以上 |
演算子なしで値を直接渡すと、等価チェックとして扱われます。
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": "docs/getting-started/" }
}
}
}これは次と同等です。
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$eq": "docs/getting-started/" } }
}
}
}上限と下限の演算子を組み合わせて、範囲でフィルターします。
{
"ai_search_options": {
"retrieval": {
"filters": { "timestamp": { "$gte": 1735689600, "$lt": 1735900000 } }
}
}
}複数のキーを指定すると、すべての条件に一致する必要があります。
{
"ai_search_options": {
"retrieval": {
"filters": {
"folder": "docs/getting-started/",
"timestamp": { "$gte": 1735689600 }
}
}
}
}保存済みのスカラーフィールドを、候補配列のいずれかの値と照合します。$in は保存済み配列の中は検索しません。
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$in": ["docs/guides/", "docs/tutorials/"] } }
}
}
}範囲クエリを使い、フォルダーとそのサブフォルダー内のすべてのファイルをフィルターします。
次のファイル構成を例にします。
- docs
- guide.pdf
- tutorials
- getting-started
- intro.pdf
- getting-started
{ "folder": "docs/" } は、そのフォルダー直下のファイル(guide.pdf など)だけに一致し、サブフォルダー内のファイルには一致しません。
docs/ で始まるすべてのファイルに一致させるには、範囲クエリを使います。
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$gte": "docs/", "$lt": "docs0" } }
}
}
}これが機能する理由は次のとおりです。
$gteはdocs/で始まるすべてのパスを含めますdocs0に対する$ltは、docs/で始まらないパスを除外します(ASCII では0が/の後ろに来るため)