基本運算符號

Milvus 提供豐富的基本運算符號,幫助您有效地過濾和查詢資料。這些運算符允許您根據標量字段、數字計算、邏輯條件等細化搜尋條件。了解如何使用這些運算符號,對建立精確的查詢和最大化搜尋效率至關重要。

比較運算符號

比較運算符用於根據相等、不相等或大小篩選資料。它們適用於數值和文字欄位。

支援的比較運算符:

  • == (等於)

  • != (不等於)

  • > (大於)

  • < (小於)

  • >= (大於或等於)

  • <= (小於或等於)

範例 1:使用 Equal To 過濾 (==)

假設您有一個名為status 的欄位,而您想要找出status 為「活躍」的所有實體。您可以使用相等運算符==

filter = 'status == "active"'

範例 2:使用 Not Equal To 過濾 (!=)

尋找status 不是「非活躍」的實體:

filter = 'status != "inactive"'

範例 3:使用「大於」篩選 (>)

如果要尋找age 大於 30 的所有實體:

filter = 'age > 30'

範例 4:使用「小於」篩選

若要尋找price 小於 100 的實體:

filter = 'price < 100'

範例 5: 使用大於或等於 (>=) 過濾

如果要尋找rating 大於或等於 4 的所有實體:

filter = 'rating >= 4'

範例 6:使用小於或等於進行篩選

若要尋找discount 小於或等於 10% 的實體:

filter = 'discount <= 10'

範圍運算符號

範圍運算符有助於根據特定值集或範圍篩選資料。

支援的範圍運算符:

  • IN:用於匹配特定集合或範圍內的值。

  • LIKE:用於匹配模式(主要用於文本字段)。 Milvus 允許您在 VARCHAR 或 JSON 欄位上建立NGRAM 索引,以加速文字查詢。詳情請參閱NGRAM

範例 1:使用IN 來匹配多個值

如果您要尋找color 為「紅色」、「綠色」或「藍色」的所有實體:

filter = 'color in ["red", "green", "blue"]'

當您要檢查一個值清單中的成員資格時,這非常有用。

範例 2:使用LIKE 進行模式匹配

LIKE 運算符號用於字串欄位中的模式匹配。它可以匹配文本中不同位置的子串:前綴後綴後綴LIKE 運算符號使用% 符號作為通配符,可以匹配任何數量的字元(包括零)。

在大多數情況下,下綴 或後綴匹配會比前綴匹配慢很多。如果性能非常重要,請謹慎使用。

前綴匹配(從開始)

若要執行前綴匹配,即字串以指定的模式開始,您可以將模式放在開頭,並使用% 來匹配其後的任何字元。例如,搜尋name 以「Prod」開頭的所有產品:

filter = 'name LIKE "Prod%"'

這將匹配任何名稱以 "Prod 「開頭的產品,例如 」Product A"、"Product B "等。

後綴匹配 (結尾為)

對於後綴匹配,如果字串以指定的樣式結束,請將% 符號放在樣式的開頭。例如,搜尋name 以「XYZ」結尾的所有產品:

filter = 'name LIKE "%XYZ"'

這將匹配任何名稱以 "XYZ 「結尾的產品,例如 」ProductXYZ"、"SampleXYZ "等。

下位元匹配 (包含)

若要執行中位元(infix)匹配,即模式可以出現在字串中的任何位置,您可以將% 符號放在模式的開頭和結尾。例如,要搜尋name 包含「Pro」的所有產品:

filter = 'name LIKE "%Pro%"'

這將匹配任何名稱包含子串「Pro」的產品,例如「Product」、「ProLine」或「SuperPro」。

算術運算符號

算術運算符允許您根據涉及數字欄位的計算建立條件。

支援的算術運算元:

  • + (加法)

  • - (減法)

  • * (乘法)

  • / (除法)

  • % (模乘)

  • ** (幂级数)

範例 1:使用模數 (%)

尋找id 是偶數(即能被 2 整除)的實體:

filter = 'id % 2 == 0'

例 2:使用幂级数 (**)

尋找price 升為 2 的幂大於 1000 的實體:

filter = 'price ** 2 > 1000'

邏輯運算符號

邏輯運算符用來將多個條件結合為更複雜的篩選表達式。這些運算符包括AND,OR, 和NOT

支援的邏輯運算符:

  • AND:結合必須全為真的多個條件。

  • OR:組合條件,其中至少有一個條件必須為真。

  • NOT:否定一個條件。

範例 1:使用AND 來合併條件

查找price 大於 100 且stock 大於 50 的所有產品:

filter = 'price > 100 AND stock > 50'

範例 2:使用OR 來合併條件

查找color 為「紅色」或「藍色」的所有產品:

filter = 'color == "red" OR color == "blue"'

範例 3:使用NOT 來排除條件

要找出color 不是「綠色」的所有產品:

filter = 'NOT color == "green"'

IS NULL 和 IS NOT NULL 運算符號

IS NULLIS NOT NULL 運算符用於根據欄位是否包含空值(沒有資料)來篩選欄位。

  • IS NULL:識別特定欄位包含空值的實體,即值不存在或未定義。

  • IS NOT NULL:識別特定欄位包含空值以外任何值的實體,即該欄位具有有效的定義值。

運算符號不區分大小寫,因此您可以使用IS NULLis null ,以及IS NOT NULLis not null

具有空值的正則標量欄位

Milvus 允許篩選具有空值的正規標量字段,例如字串或數字。

空字串"" 不會被視為VARCHAR 欄位的空值。

檢索description 欄位為空值的實體:

filter = 'description IS NULL'

檢索description 欄位不是空值的實體:

filter = 'description IS NOT NULL'

要檢索description 欄位非空且price 欄位大於 10 的實體:

filter = 'description IS NOT NULL AND price > 10'

具有空值的 JSON 欄位

Milvus 允許過濾包含空值的 JSON 欄位。以下方式會將 JSON 欄位視為空值:

  • 整個 JSON 物件被明確設置為 None (空值),例如{"metadata": None}

  • 實體中完全沒有 JSON 欄位本身。

如果 JSON 物件中的某些元素為空(例如個別鍵),欄位仍會被視為非空。例如,即使category 鍵為空,\{"metadata": \{"category": None, "price": 99.99}} 也不會被視為空。

為了進一步說明 Milvus 如何處理具有空值的 JSON 欄位,請考慮以下具有 JSON 欄位metadata 的範例資料:

data = [
  {
      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "metadata": None, # Entire JSON object is null
      "pk": 2,
      "embedding": [0.56, 0.78, 0.90]
  },
  {  # JSON field `metadata` is completely missing
      "pk": 3,
      "embedding": [0.91, 0.18, 0.23]
  },
  {
      "metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
      "pk": 4,
      "embedding": [0.56, 0.38, 0.21]
  }
]

範例 1:擷取元資料為空的實體

尋找metadata 欄位遺失或明確設定為 None 的實體:

filter = 'metadata IS NULL'

# Example output:
# data: [
#     "{'metadata': None, 'pk': 2}",
#     "{'metadata': None, 'pk': 3}"
# ]

範例 2:擷取 metadata 不為空的實體

尋找metadata 欄位不是 null 的實體:

filter = 'metadata IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

具有空值的 ARRAY 欄位

Milvus 允許過濾包含空值的 ARRAY 欄位。ARRAY 欄位會以下列方式視為空值:

  • 整個 ARRAY 欄位明確設定為 None (空值),例如"tags": None

  • ARRAY 欄位在實體中完全遺失。

ARRAY 欄位不能包含部分 null 值,因為 ARRAY 欄位中的所有元素必須具有相同的資料類型。詳情請參閱陣列欄位

為了進一步說明 Milvus 如何處理具有空值的 ARRAY 欄位,請考慮以下具有 ARRAY 欄位的範例資料tags

data = [
  {
      "tags": ["pop", "rock", "classic"],
      "ratings": [5, 4, 3],
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "tags": None,  # Entire ARRAY is null
      "ratings": [4, 5],
      "pk": 2,
      "embedding": [0.78, 0.91, 0.23]
  },
  {  # The tags field is completely missing
      "ratings": [9, 5],
      "pk": 3,
      "embedding": [0.18, 0.11, 0.23]
  }
]

範例 1:檢索標籤為空值的實體

要擷取tags 欄位遺失或明確設定為None 的實體:

filter = 'tags IS NULL'

# Example output:
# data: [
#     "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
#     "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]

範例 2:擷取 tags 不為空的實體

檢索tags 欄位不是 null 的實體:

filter = 'tags IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

對 JSON 和 ARRAY 欄位使用基本運算符的提示

雖然 Milvus 的基本運算符是多用途的,可以應用在標量欄位,但它們也可以有效地用於 JSON 和 ARRAY 欄位中的鍵和索引。

例如,如果您有一個product 欄位,其中包含多個鍵值,如price,model, 和tags ,總是直接引用鍵值:

filter = 'product["price"] > 1000'

若要尋找記錄溫度陣列中第一個溫度超過特定值的記錄,請使用:

filter = 'history_temperatures[0] > 30'

結論

Milvus 提供了一系列基本運算符號,讓您可以靈活地過濾和查詢資料。透過結合比較、範圍、算術和邏輯運算符號,您可以建立強大的篩選表達式,以縮窄搜尋結果的範圍,並有效率地擷取所需的資料。

常見問題

篩選條件 (例如 filter='color in ["red", "green", "blue"]') 中的匹配值清單長度是否有限制?如果清單太長該怎麼辦?

Zilliz Cloud 不會對篩選條件中的匹配值清單設定長度限制。但是,過長的清單可能會嚴重影響查詢效能。 如果您的篩選條件包含長長的匹配值清單,或是包含許多元素的複雜表達式,我們建議您使用篩選器模板來改善查詢效能。