Azure Cognitive Search での OData コレクション演算子 - anyallOData collection operators in Azure Cognitive Search - any and all

Azure Cognitive Search で使用する OData フィルター式を記述する場合、コレクション フィールドにフィルターを適用すると便利なことがよくあります。When writing an OData filter expression to use with Azure Cognitive Search, it is often useful to filter on collection fields. これを行うには、any 演算子と all演算子を使用します。You can achieve this using the any and all operators.

構文Syntax

次の EBNF (拡張バッカス・ナウア記法) では、any または all を使用する OData 式の文法が定義されています。The following EBNF (Extended Backus-Naur Form) defines the grammar of an OData expression that uses any or all.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

対話型の構文ダイアグラムも利用できます。An interactive syntax diagram is also available:

注意

完全な EBNF については、Azure Cognitive Search の OData 式構文リファレンスに関するページをご覧ください。See OData expression syntax reference for Azure Cognitive Search for the complete EBNF.

コレクションをフィルター処理する式には 3 つの形式があります。There are three forms of expression that filter collections.

  • 最初の 2 つでは、コレクション フィールドが反復処理されて、ラムダ式の形式で指定された述語がコレクションの各要素に適用されます。The first two iterate over a collection field, applying a predicate given in the form of a lambda expression to each element of the collection.
    • all を使用する式からは、コレクションのすべての要素に対して述語が true の場合、true が返されます。An expression using all returns true if the predicate is true for every element of the collection.
    • any を使用する式からは、コレクションの少なくとも 1 つの要素に対して述語が true の場合、true が返されます。An expression using any returns true if the predicate is true for at least one element of the collection.
  • コレクション フィルターの 3 番目の形式では、ラムダ式なしで any を使用して、コレクション フィールドが空かどうかがテストされます。The third form of collection filter uses any without a lambda expression to test whether a collection field is empty. コレクションに要素が含まれている場合は、true が返されます。If the collection has any elements, it returns true. コレクションが空の場合は、false が返されます。If the collection is empty, it returns false.

コレクション フィルター内のラムダ式は、プログラミング言語のループ本体のようなものです。A lambda expression in a collection filter is like the body of a loop in a programming language. これにより、反復中にコレクションの現在の要素を保持する、範囲変数と呼ばれる変数が定義されます。It defines a variable, called the range variable, that holds the current element of the collection during iteration. また、コレクションの各要素の範囲変数に適用されるフィルター条件である別のブール式も定義されます。It also defines another boolean expression that is the filter criteria to apply to the range variable for each element of the collection.

Examples

tags フィールドに文字列 "wifi" と一致するものが含まれているドキュメントを照合します。Match documents whose tags field contains exactly the string "wifi":

tags/any(t: t eq 'wifi')

ratings フィールドのすべての要素が 3 から 5 の範囲 (両数値を含む) に収まるドキュメントを照合します。Match documents where every element of the ratings field falls between 3 and 5, inclusive:

ratings/all(r: r ge 3 and r le 5)

locations フィールドの地理座標のいずれかが、指定された多角形の範囲内にあるドキュメントを照合します。Match documents where any of the geo coordinates in the locations field is within the given polygon:

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 フィールドが空であるドキュメントを照合します。Match documents where the rooms field is empty:

not rooms/any()

すべての部屋において、rooms/amenities フィールドに "tv" が含まれ、rooms/baseRate が 100 未満であるドキュメントを照合します。Match documents where for all rooms, the rooms/amenities field contains "tv" and rooms/baseRate is less than 100:

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

制限事項Limitations

フィルター式のすべての機能がラムダ式の本体内で使用できるわけではありません。Not every feature of filter expressions is available inside the body of a lambda expression. 制限事項は、フィルター処理するコレクション フィールドのデータ型によって異なります。The limitations differ depending on the data type of the collection field that you want to filter. 以下の表に制限事項をまとめています。The following table summarizes the limitations.

データ型Data type any を含むラムダ式で許可されている機能Features allowed in lambda expressions with any all を含むラムダ式で許可されている機能Features allowed in lambda expressions with all
Collection(Edm.ComplexType) search.ismatchsearch.ismatchscoring を除くすべてEverything except search.ismatch and search.ismatchscoring 同じSame
Collection(Edm.String) eq または search.in での比較Comparisons with eq or search.in

or でのサブ式の組み合わせCombining sub-expressions with or
ne または not search.in() での比較Comparisons with ne or not search.in()

and でのサブ式の組み合わせCombining sub-expressions with and
Collection(Edm.Boolean) eq または ne での比較Comparisons with eq or ne 同じSame
Collection(Edm.GeographyPoint) lt または le での geo.distance の使用Using geo.distance with lt or le

geo.intersects

or でのサブ式の組み合わせCombining sub-expressions with or
gt または ge での geo.distance の使用Using geo.distance with gt or ge

not geo.intersects(...)

and でのサブ式の組み合わせCombining sub-expressions with and
Collection(Edm.DateTimeOffset)Collection(Edm.Double)Collection(Edm.Int32), Collection(Edm.Int64)Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) eqneltgtle、または ge を使用した比較Comparisons using eq, ne, lt, gt, le, or ge

or を使用した、比較と他のサブ式の組み合わせCombining comparisons with other sub-expressions using or

and を使用した、ne を除く比較と他のサブ式の組み合わせCombining comparisons except ne with other sub-expressions using and

選言標準形 (DNF) での andor の組み合わせを使用した式Expressions using combinations of and and or in Disjunctive Normal Form (DNF)
eqneltgtle、または ge を使用した比較Comparisons using eq, ne, lt, gt, le, or ge

and を使用した、比較と他のサブ式の組み合わせCombining comparisons with other sub-expressions using and

or を使用した、eq を除く比較と他のサブ式の組み合わせCombining comparisons except eq with other sub-expressions using or

連言標準形 (CNF) での andor の組み合わせを使用した式Expressions using combinations of and and or in Conjunctive Normal Form (CNF)

これらの制限と例の詳細については、Azure Cognitive Search でのコレクション フィルターのトラブルシューティングに関する記事をご覧ください。For more details on these limitations as well as examples, see Troubleshooting collection filters in Azure Cognitive Search. これらの制限が存在する理由の詳細については、Azure Cognitive Search でのコレクション フィルターの概要に関する記事をご覧ください。For more in-depth information on why these limitations exist, see Understanding collection filters in Azure Cognitive Search.

次の手順Next steps