Azure AI 搜尋中的 OData 邏輯運算子 - and
、 or
not
Azure AI 搜尋中的 OData 篩選表示式 是評估為 true
或 false
的布爾運算式。 您可以撰寫一系列較簡單的篩選,並使用布林代數的邏輯運算符來撰寫複雜的篩選:
and
:如果其左右子表達式評估為true
,則為 的二進位運算符true
。or
:如果其中一個左右子表達式評估為 ,則會評估true
為true
的二進位運算符。not
:如果子表達式評估為 ,則評估true
為false
的一元運算符,反之亦然。
這些集合運算子any
和 all
可讓您建構可表達非常複雜搜尋準則的篩選。
語法
下列 EBNF (Extended Backus-Naur Form) 會定義使用邏輯運算符的 OData 表達式文法。
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
我們也提供互動式語法圖表:
注意
如需完整的 EBNF,請參閱 Azure AI 搜尋服務的 OData 運算式語法參考。
邏輯表達式有兩種形式:binary (and
/or
),其中有兩個子運算式,而一元表達式not
則只有一個。 子運算式可以是任何類型的布爾表達式:
- 類型的欄位或範圍變數
Edm.Boolean
- 傳回 類型
Edm.Boolean
值的函式,例如geo.intersects
或search.ismatch
- 比較表達式,例如
rating gt 4
- 集合表達式,例如
Rooms/any(room: room/Type eq 'Deluxe Room')
- 布林常值
true
或false
。 - 使用
and
、or
和not
建構的其他邏輯表達式。
重要
在某些情況下,並非所有子表達式都可以搭配 and
/or
使用,特別是在 Lambda 運算式內。 如需詳細資訊,請參閱 Azure AI 搜尋 中的 OData 集合運算符。
邏輯運算子和 null
大部分的布爾表達式,例如函式和比較都無法產生 null
值,而且邏輯運算符無法直接套用至 null
常值(例如 x and null
不允許)。 不過,布爾值欄位可以是 null
,因此您必須知道、 or
和 not
運算符在 Null 存在時的行為and
。 下表摘要說明,其中 b
是類型的 Edm.Boolean
欄位:
運算式 | 當 為 時 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
相同。 這與使用 和 or
與其他運算式and
結合時的行為一致,如上表所示。 儘管如此,與 (b eq false
) 的直接比較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)