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

Azure 認知搜尋中的OData 篩選運算式是評估為或的布林運算式 true false 。 您可以撰寫一系列 簡單的篩選 ,並使用 布林代數中的邏輯運算子來撰寫複雜的篩選,以撰寫複雜的篩選準則:

  • and:二元運算子, true 如果其左邊和右邊的子運算式都評估為,則會評估為 true
  • or:二元運算子, true 如果其中一個左邊或右邊的子運算式評估為,則會評估為 true
  • not:一元運算子, true 如果子運算式評估為,則會評估為 false ,反之亦然。

這些會與集合運算子 anyall 一起使用,可讓您建立可表達非常複雜搜尋條件的篩選準則。

Syntax

下列 EBNF (擴充 Backus-Naur 表單) 定義使用邏輯運算子之 OData 運算式的文法。

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

您也可以使用互動式語法圖:

注意

如需完整 EBNF 的詳細 Azure 認知搜尋,請參閱 OData 運算式語法參考

有兩種形式的邏輯運算式:二元 (and / or) ,其中有兩個子運算式和一元 (not) ,其中只有一個。 子運算式可以是任何種類的布林運算式:

  • 類型的欄位或範圍變數 Edm.Boolean
  • 傳回類型值的函式 Edm.Boolean ,例如 geo.intersects 或。 search.ismatch
  • 比較運算式,例如 rating gt 4
  • 集合運算式,例如 Rooms/any(room: room/Type eq 'Deluxe Room')
  • 布林常值 truefalse
  • 使用、和所建立的其他邏輯運算式 and or not

重要

在某些情況下,並非所有類型的子運算式都可以搭配使用 and / or ,尤其是在 lambda 運算式中。 如需詳細資訊,請參閱 Azure 認知搜尋中的 OData 集合運算子

邏輯運算子和 null

大部分的布林運算式(如函數和比較)無法產生 null 值,而且邏輯運算子無法直接套用至 null 常值 (例如, x and null) 不允許。 不過,布林值欄位可以是 null ,因此您必須留意 andornot 運算子在存在 null 時的行為。 下表將摘要說明,其中是下列 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 相同。 這與使用和的其他運算式結合時的行為一致 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 指定多邊形內的檔,而且檔不包含「公用」一詞。

    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')

在 deluxe 的房間內,在加拿大的旅館中比對的旅館,其基本費率低於160:

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

下一步