Azure AI Search の OData 論理演算子 -
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)