基本運算子
Milvus 提供豐富的基本運算子,協助您高效地篩選與查詢資料。透過這些運算子,您可以根據標量欄位、數值運算、邏輯條件等來精確調整搜尋條件。掌握這些運算子的使用方法,對於建構精確的查詢並最大化搜尋效率至關重要。
比較運算子
比較運算子用於根據等於、不等於或大小進行資料篩選,適用於數值與文字欄位。
支援的比較運算子
==(等於)!=(不等於)>(大於)<(小於)>=(大於或等於)<=(小於或等於)
範例 1:使用「等於」進行篩選 (==)
假設您有一個名為status 的欄位,且您想找出所有status 為「active」的實體。您可以使用等於運算子== :
filter = 'status == "active"'
範例 2:使用「不等於」篩選 (!=)
若要找出status 並非「inactive」的實體:
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'
範圍運算子
範圍運算子可協助根據特定值集篩選資料。Milvus 支援使用IN 進行集合成員資格檢查。
若要找出所有「color 」為「red」、「green」或「blue」的實體:
filter = 'color in ["red", "green", "blue"]'
當您需要檢查資料是否屬於一組特定值時,此功能非常實用。
模式匹配運算子
模式匹配運算子可協助根據通配符模式或正規表達式篩選字串值。
LIKE: 用於根據字串值匹配簡單的萬用字元模式。例如,name LIKE "Prod%"會匹配以Prod開頭的值。=~: 用於將字串值與 RE2 正規表達式進行比對。例如,code =~ "E[0-9]{4}"會匹配包含錯誤代碼的值,例如E1001。!~: 用於排除與 RE2 正規表達式相符的字串值。這等同於NOT (field =~ "pattern")。
若要找出name 以Prod 開頭的實體:
filter = 'name LIKE "Prod%"'
若要尋找其 `code ` 包含錯誤代碼(例如E1001 )的實體:
filter = 'code =~ "E[0-9]{4}"'
若要排除message 以DEBUG 開頭的實體:
filter = 'message !~ "^DEBUG"'
有關在「LIKE 」與正規表達式(regex)之間進行選擇、受支援的欄位類型、正規表達式語法、轉義規則及效能等詳細資訊,請參閱《模式匹配》。Milvus 亦允許您針對「VARCHAR 」欄位或 JSON 字串路徑建立「NGRAM 」索引,以加速符合條件的模式匹配篩選器。詳細資訊請參閱《NGRAM》。
算術運算子
算術運算子可讓您根據涉及數值欄位的計算來建立條件。
支援的算術運算子
+(加法)-(減法)*(乘法)/(除法)%(取模)**(冪運算)
範例 1:使用模運算 (%)
找出使id 為偶數(即能被 2 整除)的數:
filter = 'id % 2 == 0'
範例 2:使用冪運算 (**)
要找出price 提升至 2 次方後大於 1000 的實體:
filter = 'price ** 2 > 1000'
位元運算子Compatible with Milvus 3.0.0+
當整數欄位編碼多個標誌(例如權限、功能標誌或狀態位元)時,位元運算子便十分實用。您可以在篩選表達式中使用這些運算子,以檢查、組合或比較整數值中的個別位元。
對於標量欄位,位元運算子適用於整數欄位類型,例如INT8 、INT16 、INT32 以及INT64 。
受支援的位元運算子
| 運算子 | 名稱 | 典型用途 |
|---|---|---|
& | 位元與 (AND) | 檢查特定位元是否已設定。 |
| | 位元或 | 在比較前將位元進行組合。 |
^ | 位元異或 | 比較兩個值之間的位元差異。 |
範例:根據權限位元進行篩選
假設您有一個名為 `permissions` 的整數欄位,且該整數中的每個位元代表一個權限標誌:
| 權限標誌 | 位元值 |
|---|---|
READ | 1 |
WRITE | 2 |
SHARE | 4 |
ADMIN | 8 |
例如,permissions = 5 表示READ 和SHARE 位元已設定,因為5 = 1 + 4 。
若要找出「SHARE 」位元已設定的實體,請使用位元與運算 (&):
filter = "(permissions & 4) == 4"
|若要找出設定WRITE 位元後會產生READ + WRITE + SHARE 權限集的實體,請使用位元與 ( ):
filter = "(permissions | 2) == 7"
若要找出其權限位元與 `READ + WRITE + SHARE ` 僅在 `WRITE ` 位元上有所不同的實體,請使用位元異或 (^):
filter = "(permissions ^ 7) == 2"
在比較結果之前,請務必將位元運算用括號包起來,例如(permissions & 4) == 4 。Milvus 3.0.0 在篩選表達式中支援& 、| 以及^ 。位元非(~ )和移位運算子(<< 及>> )則不被支援。
邏輯運算子
邏輯運算子用於將多個條件組合成更複雜的篩選表達式。這些運算子包括AND 、OR 以及NOT 。
受支援的邏輯運算子
AND:將多個條件組合起來,且所有條件都必須為真。OR: 將多個條件組合,其中至少有一個必須為真。NOT: 否定一個條件。
範例 1:使用AND 組合條件
要找出所有「price 」大於 100 且「stock 」大於 50 的產品:
filter = 'price > 100 AND stock > 50'
範例 2:使用「OR 」組合條件
要找出所有「color 」為「red」或「blue」的商品:
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: 識別特定欄位包含 null 值的實體,即該欄位無值或未定義。IS NOT NULL:識別特定欄位包含 null 以外任何值的實體,意即該欄位具有有效且已定義的值。
這些運算子不區分大小寫,因此您可以使用IS NULL 或is null ,以及IS NOT NULL 或is not null 。
包含 null 值的常量標量欄位
Milvus 允許針對具有 null 值的常規標量欄位(例如字串或數字)進行篩選。
對於VARCHAR 欄位,空字串"" 不會被視為 null 值。
若要擷取description 欄位為 null 的實體:
filter = 'description IS NULL'
若要擷取description 欄位不為空的實體:
filter = 'description IS NOT NULL'
若要擷取description 欄位不為空,且price 欄位大於 10 的實體:
filter = 'description IS NOT NULL AND price > 10'
具有 null 值的 JSON 欄位
Milvus 允許針對包含 null 值的 JSON 欄位進行篩選。JSON 欄位在以下情況下會被視為 null:
整個 JSON 物件被明確設定為 None(null),例如
{"metadata": None}。該 JSON 欄位本身在實體中完全缺失。
若 JSON 物件中的某些元素為 null(例如個別鍵),該欄位仍被視為非 null。例如,\{"metadata": \{"category": None, "price": 99.99}} 即使category 鍵為 null,也不會被視為 null。
為了進一步說明 Milvus 如何處理具有 null 值的 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:擷取元資料為 null 的實體
要查找metadata 欄位缺失或明確設定為 None 的實體:
filter = 'metadata IS NULL'
# Example output:
# data: [
# "{'metadata': None, 'pk': 2}",
# "{'metadata': None, 'pk': 3}"
# ]
範例 2:擷取元資料不為 null 的實體
若要查找 `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}"
# ]
包含 null 值的 ARRAY 欄位
Milvus 允許針對包含 null 值的 ARRAY 欄位進行篩選。ARRAY 欄位在以下情況下會被視為 null:
整個 ARRAY 欄位被明確設定為 None(null),例如
"tags": None。該 ARRAY 欄位在實體中完全缺失。
陣列欄位無法包含部分 null 值,因為陣列欄位中的所有元素必須具有相同資料類型。詳細資訊請參閱「陣列欄位」。
為進一步說明 Milvus 如何處理含有 null 值的 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` 為 null 的實體
若要擷取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 ` 欄位不為空的實體:
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 並未對篩選條件中的匹配值清單長度設限。然而,過長的清單可能會顯著影響查詢效能。 若您的篩選條件包含冗長的匹配值清單,或含有許多元素的複雜表達式,我們建議使用「篩選模板」功能來提升查詢效能。