基本運算符號
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 NULL 和IS NOT NULL 運算符用於根據欄位是否包含空值(沒有資料)來篩選欄位。
IS NULL:識別特定欄位包含空值的實體,即值不存在或未定義。IS NOT NULL:識別特定欄位包含空值以外任何值的實體,即該欄位具有有效的定義值。
運算符號不區分大小寫,因此您可以使用IS NULL 或is null ,以及IS NOT NULL 或is 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 不會對篩選條件中的匹配值清單設定長度限制。但是,過長的清單可能會嚴重影響查詢效能。 如果您的篩選條件包含長長的匹配值清單,或是包含許多元素的複雜表達式,我們建議您使用篩選器模板來改善查詢效能。