Azure AI 搜尋服務 中的 OData 集合運算子:any 和 all

注意

Azure AI 搜尋服務 可透過 Azure 入口網站、REST API 及 Azure SDK 取得。 它同時也是 Foundry IQ 的基礎,這是一個管理式知識層,能將企業內容轉化為可重複使用、權限感知的知識庫,供 Microsoft Foundry 入口網站中的代理使用。

撰寫 OData 篩選表示式 以搭配 Azure AI 搜尋使用時,篩選集合欄位通常很有用。 您可以使用 any 和 all 運算符來達成此目的。

語法

下列 EBNF (Extended Backus-Naur Form) 會定義使用 any 或 all的 OData 表達式文法。

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

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

注意

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

篩選集合的表達式有三種形式。

  • 前兩者會遍歷集合欄位,將以 Lambda 運算式形式給出的謂詞套用至集合的每個元素。
    • 如果集合的每個元素的述詞為 true,則使用 all 的運算式會傳回 true 。
    • 如果至少一個集合元素的述詞為 true,則使用 any 的運算式會傳回 true 。
  • 集合篩選的第三種形式會使用 any 沒有 Lambda 運算式來測試集合欄位是否空白。 如果集合有任何元素,則會傳回 true。 如果集合是空的,則會傳 false回 。

集合篩選中的 Lambda 運算式如同程式語言中的迴圈內容。 它定義了一個稱為範圍變數的變數,該變數在迭代期間保存集合的當前元素。 它也會定義另一個布爾表達式,也就是要套用至集合中每個元素之範圍變數的篩選條件。

範例

比對 tags 欄位完全包含字串「wifi」的文件:

tags/any(t: t eq 'wifi')

比對 ratings 欄位的任何元素都介於 3 和 5 (含) 之間的文件:

ratings/all(r: r ge 3 and r le 5)

比對 locations 欄位中的任何地理座標落在指定多邊形內的文件:

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

尋找 rooms 欄位為空的檔案。

not rooms/any()

比對 (針對所有房間) rooms/amenities 欄位包含「tv」,且 rooms/baseRate 小於 100 的文件:

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

限制

並非所有篩選表達式的功能都可以在 Lambda 運算式主體內使用。 這些限制會因您想要篩選的集合欄位數據類型而有所不同。 下表摘要說明限制。

資料類型 使用 any 的 Lambda 運算式所允許的功能 使用 all 的 Lambda 運算式所允許的功能
Collection(Edm.ComplexType) search.ismatch 和 search.ismatchscoring 以外的一切 相同
Collection(Edm.String) 使用 eq 或 search.in 的比較

將子運算式以 or 結合
使用 ne 或 not search.in() 的比較

將子運算式以 and 結合
Collection(Edm.Boolean) 使用 eq 或 ne 的比較 相同
Collection(Edm.GeographyPoint) 使用 geo.distance 搭配 lt 或 le

geo.intersects

將子運算式以 or 結合
使用 geo.distance 搭配 gt 或 ge

not geo.intersects(...)

將子運算式以 and 結合
Collection(Edm.DateTimeOffset)、 、 Collection(Edm.Double)、 Collection(Edm.Int32)Collection(Edm.Int64) 使用 eq、ne、lt、gt、le 或 ge 的比較

使用 or 將比較與其他子運算式結合

使用 ne 將比較 (除 and 以外) 與其他子運算式組合

以 and 和 or 組合的運算式,採用析取正規形式 (DNF)
使用 eq、ne、lt、gt、le 或 ge 的比較

使用 and 將比較與其他子運算式結合

使用 eq 將比較 (除 or 以外) 與其他子運算式組合

以 and 和 or 組合的運算式,採用合取正規形式 (CNF)

如需這些限制和範例的詳細資訊,請參閱 針對 Azure AI 搜尋中的收集篩選器進行疑難解答。 如需這些限制存在原因的詳細資訊,請參閱 瞭解 Azure AI 搜尋中的收集篩選器。

下一步