Azure AI Search の OData 論理演算子 - andornot

Azure AI Search でOData フィルター式は、 true または falseに評価されるブール式です。 一連のよりシンプルなフィルターを記述し、それらをブール代数の論理演算子を使って作成することで、複雑なフィルターを記述することができます。

  • and: 左と右のサブ式が両方とも true に評価された場合に true に評価される 2 項演算子です。
  • or: 左または右のサブ式のいずれかが true に評価された場合に true に評価される 2 項演算子です。
  • not: サブ式が false に評価された場合に true に評価される、またはその逆が当てはまる単項演算子です。

これらを、コレクション演算子 any および all と組み合わせることで、非常に複雑な検索条件を表現するフィルターを作成することができます。

構文

次の EBNF (拡張バッカス・ナウア記法形式) では、論理演算子を使用する OData 式の文法が定義されます。

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

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

Note

完全な EBNF については、Azure AI Searchの OData 式構文参照 を参照してください。

論理式には次の 2 つの形式があります。2 つのサブ式がある 2 項 (and/or) 形式と、サブ式が 1 つしかない単項 (not) 形式です。 サブ式は、次のような任意の種類のブール式とすることができます。

  • Edm.Boolean 型のフィールドまたは範囲変数
  • geo.intersectssearch.ismatch など Edm.Boolean 型の値を返す関数
  • rating gt 4 などの比較式
  • Rooms/any(room: room/Type eq 'Deluxe Room') などのコレクション式
  • ブール型リテラル: true または false
  • andor、および not を使用して構築されるその他の論理式。

重要

状況によっては (特にラムダ式内では)、すべての種類のサブ式を and/or と一緒に使用できるとは限りません。 詳細については、Azure AI Searchの OData コレクション演算子 を参照してください。

論理演算子と null

関数や比較などのほとんどのブール式では null 値を生成できません。また論理演算子を null リテラルに直接適用することはできません (たとえば、x and null は許可されていません)。 ただし、ブール値フィールドは null にすることができます。そのため、null が存在する場合に andor、および not 演算子がどのように動作するかを認識しておく必要があります。 次の表に、これについてまとめてあります。ここで、bEdm.Boolean 型のフィールドです。

Expression bnull のときの結果
b false
not b true
b eq true false
b eq false false
b eq null true
b ne true true
b ne false true
b ne null false
b and true false
b and false false
b or true true
b or false false

ブール値フィールド b がフィルター式内に単独で現れると、それは b eq true と記述されているかのように動作します。したがって、bnull の場合、式は false と評価されます。 同様に、not bnot (b eq true) のように動作するので、true と評価されます。 このように、null フィールドは false と同様に動作します。 上の表に示すように、これは、and および or を使用して他の式と組み合わせたときの動作と一致しています。 それでも、false との直接比較 (b eq false) はやはり false に評価されます。 つまり、ブール式内で両者が同様に動作しても、nullfalse と等しくありません。

rating フィールドが 3 から 5 (両端を含む) の範囲のドキュメントを照合します。

    rating ge 3 and rating le 5

ratings フィールドのすべての要素が 3 未満または 5 を超えるドキュメントを照合します。

    ratings/all(r: r lt 3 or r gt 5)

location フィールドが指定された多角形内にあり、"public" という用語が含まれていないドキュメントを照合します。

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')

カナダのバンクーバーにある基本料金が 160 未満のデラックス ルームを備えたホテルに関するドキュメントを照合します。

    Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)

次のステップ