分享方式:


Azure AI 搜尋中的 OData 比較運算符 - eqnegtltgele

Azure AI 搜尋中 OData 篩選表示式 中最基本的作業是比較欄位與指定的值。 兩種類型的比較是可能的 -- 相等比較和範圍比較。 您可以使用下列運算符來比較欄位與常數值:

相等運算子:

  • eq:測試欄位 是否等於 常數值
  • ne:測試欄位 是否不等於 常數值

範圍運算子:

  • gt:測試欄位 是否大於 常數值
  • lt:測試欄位 是否小於 常數值
  • ge:測試欄位 是否大於或等於 常數值
  • le:測試欄位 是否小於或等於 常數值

您可以使用範圍運算子搭配 邏輯運算元 來測試欄位是否位於特定值範圍內。 請參閱本文稍後的範例

注意

如果您想要的話,您可以將常數值放在運算子左邊,並將功能變數名稱放在右側。 對於範圍運算符,比較的意義會反轉。 例如,如果常數值位於左邊, gt 會測試常數值是否大於字段。 您也可以使用比較運算符來比較函式的結果,例如 geo.distance, 與 值。 對於布爾函數,例如 search.ismatch,將結果與 truefalse 比較為選擇性。

語法

下列 EBNF (Extended Backus-Naur Form) 會定義使用比較運算符的 OData 表達式文法。

comparison_expression ::=
    variable_or_function comparison_operator constant |
    constant comparison_operator variable_or_function

variable_or_function ::= variable | function_call

comparison_operator ::= 'gt' | 'lt' | 'ge' | 'le' | 'eq' | 'ne'

我們也提供互動式語法圖表:

注意

如需完整的 EBNF,請參閱 Azure AI 搜尋服務的 OData 運算式語法參考

比較表達式有兩種形式。 它們之間的唯一差異在於常數出現在運算子的左側或右側。 運算子另一 邊的表達式必須是變數 或函數調用。 變數可以是功能變數名稱,或 Lambda 運算式案例中的範圍變數。

比較的數據類型

比較運算子兩端的數據類型必須相容。 例如,如果左邊是 類型的 Edm.DateTimeOffset字段,則右邊必須是日期時間常數。 數值數據類型更具彈性。 您可以比較任何數值類型的變數和函式與任何其他數值類型的常數,但有一些限制,如下表所述。

變數或函式類型 常數值類型 限制
Edm.Double Edm.Double 比較受限於 特殊規則 NaN
Edm.Double Edm.Int64 常數會 Edm.Double轉換成 ,導致大大小值的精確度遺失
Edm.Double Edm.Int32 n/a
Edm.Int64 Edm.Double 不允許與 NaN-INFINF 的比較
Edm.Int64 Edm.Int64 n/a
Edm.Int64 Edm.Int32 常數會在 Edm.Int64 比較之前轉換成
Edm.Int32 Edm.Double 不允許與 NaN-INFINF 的比較
Edm.Int32 Edm.Int64 n/a
Edm.Int32 Edm.Int32 n/a

針對不允許的比較,例如比較 類型的 Edm.Int64 字段與 NaN,Azure AI 搜尋服務 REST API 會傳回「HTTP 400:不正確的要求」錯誤。

重要

即使數值類型比較具有彈性,我們還是強烈建議在篩選中撰寫比較,讓常數值與所比較的變數或函式數據類型相同。 這在混合浮點和整數值時特別重要,其中可能會隱含轉換失去有效位數。

和的特殊案例nullNaN

使用比較運算子時,請務必記住,Azure AI 搜尋中的所有非集合欄位都可能是 null。 下表顯示比較表示式的所有可能結果,其中任一端可以是 null

Operator 只有欄位或變數為 時的結果 null 只有常數為 時的結果 null 當欄位或變數和常數都是時的結果 null
gt false HTTP 400:要求錯誤 HTTP 400:要求錯誤
lt false HTTP 400:要求錯誤 HTTP 400:要求錯誤
ge false HTTP 400:要求錯誤 HTTP 400:要求錯誤
le false HTTP 400:要求錯誤 HTTP 400:要求錯誤
eq false false true
ne true true false

總而言之, null 只等於本身,且不小於或大於任何其他值。

如果您的索引具有類型的 Edm.Double 欄位,而且您將值上傳 NaN 至這些欄位,則必須在撰寫篩選時加以考慮。 Azure AI 搜尋會實作 IEEE 754 標準來處理 NaN 值,並與這類值進行比較會產生非明顯的結果,如下表所示。

Operator 至少一個操作數為 時的結果 NaN
gt false
lt false
ge false
le false
eq false
ne true

總而言之, NaN 不等於任何值,包括本身。

比較地理空間數據

您無法直接比較類型的 Edm.GeographyPoint 欄位與常數值,但可以使用 函式 geo.distance 。 此函式會傳回 類型的 Edm.Double值,因此您可以將它與數值常數進行比較,以根據常數地理空間座標的距離進行篩選。 請參閱下列 範例

比較字串數據

您可以使用 和 ne 運算符,在篩選條件中比較字串,以取得完全相符專案eq。 這些比較會區分大小寫。

範例

比對 Rating 欄位介於 3 到 5 之間的檔,包括:

Rating ge 3 and Rating le 5

比對欄位距離指定緯度和經度不到 2 公里的檔案 Location

geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0

比對欄位大於或等於 2015 年 1 月 1 日午夜 UTC 的檔 LastRenovationDate

LastRenovationDate ge 2015-01-01T00:00:00.000Z

比對 Details/Sku 欄位不是 null的檔案:

Details/Sku ne null

比對至少有一個房間類型為 「豪華房間」的旅館檔,其中字段的 Rooms/Type 字串完全符合篩選條件:

Rooms/any(room: room/Type eq 'Deluxe Room')

下一步