Note
Azure AI 検索は、Azure ポータル、REST API、およびAzure SDKから使用できます。 また、Foundry IQ は、エンタープライズ コンテンツを、Microsoft Foundry ポータルのエージェントの再利用可能なアクセス許可に対応したナレッジ ベースに変換するマネージド ナレッジ レイヤーです。
フィルターは、キーワード検索のクエリ実行前、またはベクター検索のクエリ実行前または実行後にコンテンツを含めたり除外したりするための値ベースの条件を提供します。 フィルターは非ベクトル フィールドに適用されますが、ドキュメントに非ベクトル フィールドが含まれている場合は、ベクター検索で使用できます。 たとえば、チャンクされたコンテンツを中心に整理されたインデックスの場合、フィルター処理できる親レベルのフィールドやメタデータ フィールドがある場合があります。
この記事では、キーワード検索のフィルター処理について説明します。 ベクターの詳細については、「 ベクター クエリにフィルターを追加する」を参照してください。
フィルターは、 OData フィルター式の構文を使用して指定します。 キーワードとベクター検索とは対照的に、フィルターは一致が正確な場合にのみ成功します。
フィルターを使用する場合
フィルターは、"近くで検索" 地理空間検索、ファセット ナビゲーション、ユーザーが表示できるドキュメントのみを表示するセキュリティ フィルターなど、いくつかの検索エクスペリエンスの基礎となります。 これらのエクスペリエンスのいずれかを実装する場合は、フィルターが必要です。 これは、位置情報座標、ユーザーによって選択されたファセット カテゴリ、または要求元のセキュリティ ID を提供する検索クエリにアタッチされたフィルターです。
一般的なシナリオは次のとおりです。
インデックス内のコンテンツに基づいて検索結果をスライスします。 ホテルの場所、カテゴリ、アメニティを含むスキーマを指定すると、抽出条件に明示的に一致するフィルターを作成できます (シアトル、水上、ビュー)。
フィルターの依存関係に付属する検索エクスペリエンスを実装します。
- ファセット ナビゲーション では、フィルターを使用して、ユーザーが選択したファセット カテゴリを返します。
- 地理空間検索 では、フィルターを使用して、エリア内または距離で一致する "近くで検索" アプリと関数で現在の場所の座標を渡します。
- セキュリティ フィルター は、セキュリティ識別子をフィルター条件として渡します。インデックス内の一致は、ドキュメントへのアクセス権のプロキシとして機能します。
"数値検索" を実行します。 数値フィールドは取得可能であり、検索結果に表示できますが、個別に検索することはできません (フルテキスト検索の対象)。 数値データに基づく選択基準が必要な場合は、フィルターを使用します。
フィルターの実行方法
クエリ時に、フィルター パーサーは条件を入力として受け入れ、式をツリーとして表されるアトミックなブール式に変換し、インデックス内のフィルター可能なフィールドに対してフィルター ツリーを評価します。
フィルター処理は検索と並行して行われ、ドキュメントの取得と関連性スコアリングのためにダウンストリーム処理に含めるドキュメントを修飾します。 検索文字列と組み合わせて使用すると、フィルターによって後続の検索操作の呼び戻しセットが効果的に減少します。 単独で使用する場合 (たとえば、クエリ文字列が空で search=*場合)、フィルター条件は唯一の入力です。
フィルターの定義方法
フィルターは、 filterableとして属性付けされたフィールドのテキストおよび数値 (非ベクトル) コンテンツに適用されます。
フィルターは OData 式であり、filter 構文Azure AI 検索でサポートされます。
検索操作ごとに 1 つのフィルターを指定できますが、フィルター自体に複数のフィールド、複数の条件を含めることができます。また、ismatch関数を使用する場合は、複数のフルテキスト検索式を使用できます。 マルチパート フィルター式では、任意の順序で述語を指定できます (演算子の優先順位の規則に従います)。 特定のシーケンスで述語を再配置しようとすると、パフォーマンスが向上する可能性はありません。
フィルター式の制限の 1 つは、要求の最大サイズ制限です。 要求全体 (フィルターを含む) は、POST の場合は最大 16 MB、GET の場合は 8 KB にすることができます。 フィルター式の句の数にも制限があります。 経験則として、何百もの句がある場合は、制限に達するリスクがあります。 無制限のサイズのフィルターを生成しないようにアプリケーションを設計することをお勧めします。
次の例は、いくつかの API のプロトタイプフィルター定義を表しています。
POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2026-04-01
{
"search": "*",
"filter": "Rooms/any(room: room/BaseRate lt 150.0)",
"select": "HotelId, HotelName, Rooms/Description, Rooms/BaseRate"
}
options = new SearchOptions()
{
Filter = "Rating gt 4",
OrderBy = { "Rating desc" }
};
フィルター パターン
次の例は、フィルター シナリオのいくつかの使用パターンを示しています。 その他のアイデアについては、「 OData 式の構文」 > 例を参照してください。
クエリ文字列を使用しないスタンドアロン $filterは、フィルター式が目的のドキュメントを完全に修飾できる場合に便利です。 クエリ文字列がないと、字句や言語分析、スコア付け、ランク付けはありません。 検索文字列はアスタリスクに過ぎず、「すべてのドキュメントに一致」を意味します。
{ "search": "*", "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu" }クエリ文字列と $filterの組み合わせ。フィルターによってサブセットが作成され、クエリ文字列は、フィルター処理されたサブセットに対するフルテキスト検索の用語入力を提供します。 用語 (徒歩圏内の劇場) を追加すると、結果に検索スコアが導入され、用語に最も一致するドキュメントが上位にランク付けされます。 クエリ文字列でフィルターを使用することは、最も一般的な使用パターンです。
{ "search": "walking distance theaters", "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'" }"or" で区切られた複合クエリは、それぞれ独自のフィルター条件を持ちます (たとえば、'dog' の 'beagles' や 'cat' の 'siamese' など)。
orと組み合わせた式は個別に評価され、応答で返される各式に一致するドキュメントの和集合が使用されます。 この使用パターンは、search.ismatchscoring関数によって実現されます。 また、非スコアリング バージョン (search.ismatch) を使用することもできます。# Match on hostels rated higher than 4 OR 5-star motels. $filter=search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5 # Match on 'luxury' or 'high-end' in the description field OR on category exactly equal to 'Luxury'. $filter=search.ismatchscoring('luxury | high-end', 'Description') or Category eq 'Luxury'&$count=trueまた、
search.ismatchscoringではなくandを使用して、orを介したフルテキスト検索とフィルターを組み合わせることもできますが、これは機能的には、検索要求でsearchパラメーターと$filterパラメーターを使用することと同じです。 たとえば、次の 2 つのクエリで同じ結果が生成されます。$filter=search.ismatchscoring('pool') and Rating ge 4 search=pool&$filter=Rating ge 4
フィルター処理のフィールド要件
REST API では、単純なフィールドに対してフィルター可能が既定で オン になっています。 フィルター可能なフィールドはインデックス サイズを増やします。フィルターで実際に使用する予定のないフィールドには、必ず "filterable": false を設定してください。 フィールド定義の設定の詳細については、「 インデックスの作成」を参照してください。
Azure SDKでは、フィルター可能な値は既定で off です。 フィールドをフィルター可能にするには、対応する SearchField オブジェクトの IsFilterable プロパティをtrueに設定します。 次の例では、インデックス定義にマップされるモデル クラスの Rating プロパティに属性が設定されています。
[SearchField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public double? Rating { get; set; }
既存のフィールドをフィルター可能にする
既存のフィールドを変更してフィルター可能にすることはできません。 代わりに、新しいフィールドを追加するか、インデックスを再構築する必要があります。 インデックスの再構築またはフィールドのリポジトリの詳細については、「Azure AI 検索 インデックスを再構築する方法を参照してください。
テキスト フィルターの基礎
テキスト フィルターは、フィルターで指定したリテラル文字列と文字列フィールドを照合します。 $filter=Category eq 'Resort and Spa'
フルテキスト検索とは異なり、テキスト フィルターには字句分析や単語区切りがないため、比較は完全一致のみを対象とします。 たとえば、フィールド f に "晴れた日" が含まれているとします。 $filter=f eq 'sunny' は一致しませんが、 $filter=f eq 'sunny day' されます。
テキスト文字列では大文字と小文字が区別されます。つまり、テキスト フィルターでは既定で大文字と小文字が区別されます。 たとえば、 $filter=f eq 'Sunny day' は "晴れた日" を見つけることができません。 ただし、ノーマライザーを使用すると、フィルター処理をケースに依存しないようにすることができます。
テキストに対するフィルター処理のアプローチ
| アプローチ | 説明 | 使用するタイミング |
|---|---|---|
search.in |
区切られた文字列のリストに対してフィールドを照合する関数。 |
セキュリティ フィルターや、多数の生テキスト値を文字列フィールドと照合する必要があるフィルターに推奨されます。
search.in 関数は速度を目的として設計されており、eqとorを使用してフィールドを各文字列と明示的に比較するよりもはるかに高速です。 |
search.ismatch |
フルテキスト検索操作と、厳密にブール型のフィルター操作を同じフィルター式に混在させる関数。 | 1 つの要求で複数の検索フィルターの組み合わせが必要な場合は、 search.ismatch (またはそのスコアリングに相当する search.ismatchscoring) を使用します。 含むフィルターとして使用すれば、大きな文字列内の部分的な文字列を絞り込むこともできます。 |
$filter=field operator string |
フィールド、演算子、および値で構成されるユーザー定義式。 | 文字列フィールドと文字列値の完全一致を検索する場合に使用します。 |
数値フィルターの基礎
数値フィールドは、フルテキスト検索のコンテキストでは searchable されません。 文字列のみがフルテキスト検索の対象となります。 たとえば、検索語句として「99.99」と入力した場合、99.99 ドルの価格のアイテムは返されません。 代わりに、ドキュメントの文字列フィールドに数値 99 の項目が表示されます。 したがって、数値データがある場合は、範囲、ファセット、グループなどのフィルターに使用することを前提とします。
数値フィールド (価格、サイズ、SKU、ID) を含むドキュメントでは、フィールドが retrievableマークされている場合、それらの値が検索結果に表示されます。 ここでのポイントは、フルテキスト検索自体が数値フィールド型には適用できないことです。
次の手順
まず、Azure ポータルで Search explorer を試して、$filter パラメーターを使用してクエリを送信します。 不動産サンプル インデックスは、検索バーに貼り付けると、フィルター処理された次のクエリの興味深い結果を提供します。
# Geo-filter returning documents within 5 kilometers of Redmond, Washington state
# Use $count=true to get a number of hits returned by the query
# Use $select to trim results, showing values for named fields only
# Use search=* for an empty query string. The filter is the sole input
search=*&$count=true&$select=description,city,postCode&$filter=geo.distance(location,geography'POINT(-122.121513 47.673988)') le 5
# Numeric filters use comparison like greater than (gt), less than (lt), not equal (ne)
# Include "and" to filter on multiple fields (baths and bed)
# Full text search is on John Leclerc, matching on John or Leclerc
search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=baths gt 3 and beds gt 4
# Text filters can also use comparison operators
# Wrap text in single or double quotes and use the correct case
# Full text search is on John Leclerc, matching on John or Leclerc
search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=city gt 'Seattle'
その他の例については、「OData フィルター式の構文」の例>を参照してください。
関連項目
フルテキスト検索がAzure AI 検索 - ドキュメントの検索 REST API
- 単純なクエリ構文
- Lucene クエリ構文
- サポートされているデータ型