Azure AI 搜尋中的 OData 比較運算符 - eq
、 ne
、 gt
、 lt
、 ge
和 le
Azure AI 搜尋中 OData 篩選表示式 中最基本的作業是比較欄位與指定的值。 兩種類型的比較是可能的 -- 相等比較和範圍比較。 您可以使用下列運算符來比較欄位與常數值:
相等運算子:
eq
:測試欄位 是否等於 常數值ne
:測試欄位 是否不等於 常數值
範圍運算子:
gt
:測試欄位 是否大於 常數值lt
:測試欄位 是否小於 常數值ge
:測試欄位 是否大於或等於 常數值le
:測試欄位 是否小於或等於 常數值
您可以使用範圍運算子搭配 邏輯運算元 來測試欄位是否位於特定值範圍內。 請參閱本文稍後的範例。
注意
如果您想要的話,您可以將常數值放在運算子左邊,並將功能變數名稱放在右側。 對於範圍運算符,比較的意義會反轉。 例如,如果常數值位於左邊, gt
會測試常數值是否大於字段。 您也可以使用比較運算符來比較函式的結果,例如 geo.distance
, 與 值。 對於布爾函數,例如 search.ismatch
,將結果與 true
或 false
比較為選擇性。
語法
下列 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 、 -INF 或 INF 的比較 |
Edm.Int64 |
Edm.Int64 |
n/a |
Edm.Int64 |
Edm.Int32 |
常數會在 Edm.Int64 比較之前轉換成 |
Edm.Int32 |
Edm.Double |
不允許與 NaN 、 -INF 或 INF 的比較 |
Edm.Int32 |
Edm.Int64 |
n/a |
Edm.Int32 |
Edm.Int32 |
n/a |
針對不允許的比較,例如比較 類型的 Edm.Int64
字段與 NaN
,Azure AI 搜尋服務 REST API 會傳回「HTTP 400:不正確的要求」錯誤。
重要
即使數值類型比較具有彈性,我們還是強烈建議在篩選中撰寫比較,讓常數值與所比較的變數或函式數據類型相同。 這在混合浮點和整數值時特別重要,其中可能會隱含轉換失去有效位數。
和的特殊案例null
NaN
使用比較運算子時,請務必記住,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')