Azure AI Search の OData コレクション演算子 - any
と all
Azure AI Search で使用する OData フィルター式を作成する場合、コレクション フィールドにフィルターを適用すると便利なことがよくあります。 これを行うには、any
演算子と all
演算子を使用します。
構文
次の EBNF (拡張バッカス・ナウア記法) では、any
または all
を使用する OData 式の文法が定義されています。
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
対話型の構文ダイアグラムも利用できます。
Note
完全な EBNF については、「Azure AI Search の OData 式構文リファレンス」をご覧ください。
コレクションをフィルター処理する式には 3 つの形式があります。
- 最初の 2 つでは、コレクション フィールドが反復処理されて、ラムダ式の形式で指定された述語がコレクションの各要素に適用されます。
all
を使用する式からは、コレクションのすべての要素に対して述語が true の場合、true
が返されます。any
を使用する式からは、コレクションの少なくとも 1 つの要素に対して述語が true の場合、true
が返されます。
- コレクション フィルターの 3 番目の形式では、ラムダ式なしで
any
を使用して、コレクション フィールドが空かどうかがテストされます。 コレクションに要素が含まれている場合は、true
が返されます。 コレクションが空の場合は、false
が返されます。
コレクション フィルター内のラムダ式は、プログラミング言語のループ本体のようなものです。 これにより、反復中にコレクションの現在の要素を保持する、範囲変数と呼ばれる変数が定義されます。 また、コレクションの各要素の範囲変数に適用されるフィルター条件である別のブール式も定義されます。
例
tags
フィールドに文字列 "wifi" と一致するものが含まれているドキュメントを照合します。
tags/any(t: t eq 'wifi')
ratings
フィールドのすべての要素が 3 から 5 の範囲 (両数値を含む) に収まるドキュメントを照合します。
ratings/all(r: r ge 3 and r le 5)
locations
フィールドの地理座標のいずれかが、指定された多角形の範囲内にあるドキュメントを照合します。
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
rooms
フィールドが空であるドキュメントを照合します。
not rooms/any()
すべての部屋において、rooms/amenities
フィールドに "tv" が含まれ、rooms/baseRate
が 100 未満であるドキュメントを照合します。
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
制限事項
フィルター式のすべての機能がラムダ式の本体内で使用できるわけではありません。 制限事項は、フィルター処理するコレクション フィールドのデータ型によって異なります。 以下の表に制限事項をまとめています。
データ型 | any を含むラムダ式で許可されている機能 |
all を含むラムダ式で許可されている機能 |
---|---|---|
Collection(Edm.ComplexType) |
search.ismatch と search.ismatchscoring を除くすべて |
同じ |
Collection(Edm.String) |
eq または search.in での比較 or でのサブ式の組み合わせ |
ne または not search.in() での比較 and でのサブ式の組み合わせ |
Collection(Edm.Boolean) |
eq または ne での比較 |
同じ |
Collection(Edm.GeographyPoint) |
lt または le での geo.distance の使用 geo.intersects or でのサブ式の組み合わせ |
gt または ge での geo.distance の使用 not geo.intersects(...) and でのサブ式の組み合わせ |
eq 、ne 、lt 、gt 、le 、または ge を使用した比較 or を使用した、比較と他のサブ式の組み合わせ and を使用した、ne を除く比較と他のサブ式の組み合わせ 選言標準形 (DNF) での and と or の組み合わせを使用した式 |
eq 、ne 、lt 、gt 、le 、または ge を使用した比較 and を使用した、比較と他のサブ式の組み合わせ or を使用した、eq を除く比較と他のサブ式の組み合わせ 連言標準形 (CNF) での and と or の組み合わせを使用した式 |
これらの制限と例の詳細については、Azure AI Search でのコレクション フィルターのトラブルシューティングに関する記事をご覧ください。 これらの制限が存在する理由の詳細については、Azure AI Search でのコレクション フィルターに関する記事をご覧ください。