Azure AI 搜尋中的 OData 邏輯運算子 - andornot

Azure AI 搜尋中的 OData 篩選表示式 是評估為 truefalse的布爾運算式。 您可以撰寫一系列較簡單的篩選,並使用布林代數的邏輯運算符來撰寫複雜的篩選:

  • and:如果其左右子表達式評估為 true,則為 的二進位運算符true
  • or:如果其中一個左右子表達式評估為 ,則會評估 truetrue的二進位運算符。
  • not:如果子表達式評估為 ,則評估 truefalse的一元運算符,反之亦然。

這些集合運算子anyall可讓您建構可表達非常複雜搜尋準則的篩選。

語法

下列 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.intersectssearch.ismatch
  • 比較表達式,例如 rating gt 4
  • 集合表達式,例如 Rooms/any(room: room/Type eq 'Deluxe Room')
  • 布林常值 truefalse
  • 使用 andornot建構的其他邏輯表達式。

重要

在某些情況下,並非所有子表達式都可以搭配 and/or使用,特別是在 Lambda 運算式內。 如需詳細資訊,請參閱 Azure AI 搜尋 中的 OData 集合運算符。

邏輯運算子和 null

大部分的布爾表達式,例如函式和比較都無法產生 null 值,而且邏輯運算符無法直接套用至 null 常值(例如 x and null 不允許)。 不過,布爾值欄位可以是 null,因此您必須知道、 ornot 運算符在 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,因此如果 bnull,則表達式會評估為 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)

下一步