Azure AI Search の OData 論理演算子 - and
、 or
、 not
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.intersects
やsearch.ismatch
などEdm.Boolean
型の値を返す関数rating gt 4
などの比較式Rooms/any(room: room/Type eq 'Deluxe Room')
などのコレクション式- ブール型リテラル:
true
またはfalse
。 and
、or
、およびnot
を使用して構築されるその他の論理式。
重要
状況によっては (特にラムダ式内では)、すべての種類のサブ式を and
/or
と一緒に使用できるとは限りません。 詳細については、Azure AI Searchの OData コレクション演算子 を参照してください。
論理演算子と null
関数や比較などのほとんどのブール式では null
値を生成できません。また論理演算子を null
リテラルに直接適用することはできません (たとえば、x and null
は許可されていません)。 ただし、ブール値フィールドは null
にすることができます。そのため、null が存在する場合に and
、or
、および not
演算子がどのように動作するかを認識しておく必要があります。 次の表に、これについてまとめてあります。ここで、b
は Edm.Boolean
型のフィールドです。
Expression | b が null のときの結果 |
---|---|
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
と記述されているかのように動作します。したがって、b
がnull
の場合、式は false
と評価されます。 同様に、not b
は not (b eq true)
のように動作するので、true
と評価されます。 このように、null
フィールドは false
と同様に動作します。 上の表に示すように、これは、and
および or
を使用して他の式と組み合わせたときの動作と一致しています。 それでも、false
との直接比較 (b eq false
) はやはり false
に評価されます。 つまり、ブール式内で両者が同様に動作しても、null
は false
と等しくありません。
例
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)