Azure Cognitive Search での OData コレクション演算子 - anyall

Azure Cognitive 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

対話型の構文ダイアグラムも利用できます。

注意

完全な EBNF については、Azure Cognitive 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.ismatchsearch.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 でのサブ式の組み合わせ
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) eqneltgtle、または ge を使用した比較

or を使用した、比較と他のサブ式の組み合わせ

and を使用した、ne を除く比較と他のサブ式の組み合わせ

選言標準形 (DNF) での andor の組み合わせを使用した式
eqneltgtle、または ge を使用した比較

and を使用した、比較と他のサブ式の組み合わせ

or を使用した、eq を除く比較と他のサブ式の組み合わせ

連言標準形 (CNF) での andor の組み合わせを使用した式

これらの制限と例の詳細については、Azure Cognitive Search でのコレクション フィルターのトラブルシューティングに関する記事をご覧ください。 これらの制限が存在する理由の詳細については、Azure Cognitive Search でのコレクション フィルターの概要に関する記事をご覧ください。

次のステップ