跳到主要内容

基本操作符

Milvus 提供丰富的基本操作符集合,帮助您高效地过滤和查询数据。这些操作符允许您基于标量 field、数值计算、逻辑条件等细化搜索条件。了解如何使用这些操作符对于构建精确查询和最大化搜索效率至关重要。

比较操作符

比较操作符用于基于相等性、不等性或大小过滤数据。它们适用于数值和文本 field。

支持的比较操作符:

  • == (等于)

  • != (不等于)

  • > (大于)

  • < (小于)

  • >= (大于或等于)

  • <= (小于或等于)

示例 1:使用等于 (==) 过滤

假设您有一个名为 status 的 field,您想要查找所有 status 为 "active" 的 entity。您可以使用等于操作符 ==

filter = 'status == "active"'

示例 2:使用不等于 (!=) 过滤

要查找 status 不是 "inactive" 的 entity:

filter = 'status != "inactive"'

示例 3:使用大于 (>) 过滤

如果您想要查找所有 age 大于 30 的 entity:

filter = 'age > 30'

示例 4:使用小于过滤

要查找 price 小于 100 的 entity:

filter = 'price < 100'

示例 5:使用大于或等于 (>=) 过滤

如果您想要查找所有 rating 大于或等于 4 的 entity:

filter = 'rating >= 4'

示例 6:使用小于或等于过滤

要查找 discount 小于或等于 10% 的 entity:

filter = 'discount <= 10'

范围操作符

范围操作符有助于基于特定集合或值范围过滤数据。

支持的范围操作符:

  • IN:用于匹配特定集合或范围内的值。

  • LIKE:用于匹配模式(主要用于文本 field)。

示例 1:使用 IN 匹配多个值

如果您想要查找所有 color 为 "red"、"green" 或 "blue" 的 entity:

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

这在您想要检查值是否在列表中时很有用。

示例 2:使用 LIKE 进行模式匹配

LIKE 操作符用于字符串 field 中的模式匹配。它可以匹配文本中不同位置的子字符串:作为前缀中缀后缀LIKE 操作符使用 % 符号作为通配符,可以匹配任意数量的字符(包括零)。

前缀匹配(以...开始)

要执行前缀匹配,即字符串以给定模式开始,您可以将模式放在开头并使用 % 匹配其后的任何字符。例如,要查找所有 name 以 "Prod" 开始的产品:

filter = 'name LIKE "Prod%"'

这将匹配任何名称以 "Prod" 开始的产品,如 "Product A"、"Product B" 等。

后缀匹配(以...结束)

对于后缀匹配,即字符串以给定模式结束,将 % 符号放在模式的开头。例如,要查找所有 name 以 "XYZ" 结束的产品:

filter = 'name LIKE "%XYZ"'

这将匹配任何名称以 "XYZ" 结束的产品,如 "ProductXYZ"、"SampleXYZ" 等。

中缀匹配(包含)

要执行中缀匹配,即模式可以出现在字符串的任何位置,您可以在模式的开头和结尾都放置 % 符号。例如,要查找所有 name 包含单词 "Pro" 的产品:

filter = 'name LIKE "%Pro%"'

这将匹配任何名称包含子字符串 "Pro" 的产品,如 "Product"、"ProLine" 或 "SuperPro"。

算术操作符

算术操作符允许您基于涉及数值 field 的计算创建条件。

支持的算术操作符:

  • + (加法)

  • - (减法)

  • * (乘法)

  • / (除法)

  • % (取模)

  • ** (指数)

示例 1:使用取模 (%)

要查找 id 为偶数(即能被 2 整除)的 entity:

filter = 'id % 2 == 0'

示例 2:使用指数 (**)

要查找 price 的平方大于 1000 的 entity:

filter = 'price ** 2 > 1000'

逻辑操作符

逻辑操作符用于将多个条件组合成更复杂的过滤表达式。这些包括 ANDORNOT

支持的逻辑操作符:

  • 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 不是 "green" 的产品:

filter = 'NOT color == "green"'

IS NULL 和 IS NOT NULL 操作符

IS NULLIS NOT NULL 操作符用于基于特定 field 是否包含 null 值(数据缺失)过滤数据。

  • IS NULL:识别包含特定 field 为 null 值的 entity,即值不存在或未定义。

  • IS NOT NULL:识别包含特定 field 为非 null 值的 entity,即 field 具有有效、定义的值。

操作符不区分大小写,因此您可以使用 IS NULLis null,以及 IS NOT NULLis not null

常规标量 field 与 null 值

Milvus 允许对常规标量 field(如字符串或数字)进行过滤,这些 field 可能包含 null 值。

空字符串 "" 不被视为 VARCHAR field 的 null 值。

要查找 description field 为 null 的 entity:

filter = 'description IS NULL'

要查找 description field 不为 null 的 entity:

filter = 'description IS NOT NULL'

要查找 description field 不为 null 且 price field 大于 10 的 entity:

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

JSON field 与 null 值

Milvus 允许对包含 null 值的 JSON field 进行过滤。JSON field 在以下情况下被视为 null:

  • 整个 JSON 对象被明确设置为 None(null),例如 {"metadata": None}

  • JSON field 本身完全缺失。

如果 JSON 对象中的某些元素为 null(例如个别 keys),field 仍被视为非 null。例如,{"metadata": {"category": None, "price": 99.99}} 不被视为 null,即使 category key 为 null。

要进一步说明 Milvus 如何处理包含 null 值的 JSON field,请考虑以下示例数据,其中包含 JSON field metadata

data = [
{
"metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"metadata": None, # 整个 JSON 对象为 null
"pk": 2,
"embedding": [0.56, 0.78, 0.90]
},
{ # JSON field `metadata` 完全缺失
"pk": 3,
"embedding": [0.91, 0.18, 0.23]
},
{
"metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # 个别 key 值为 null
"pk": 4,
"embedding": [0.56, 0.38, 0.21]
}
]

示例 1:查找 metadata 为 null 的 entity

要查找 metadata field 缺失或明确设置为 None 的 entity:

filter = 'metadata IS NULL'

# 示例输出:
# data: [
# "{'metadata': None, 'pk': 2}",
# "{'metadata': None, 'pk': 3}"
# ]

示例 2:查找 metadata 不为 null 的 entity

要查找 metadata field 不为 null 的 entity:

filter = 'metadata IS NOT NULL'

# 示例输出:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

ARRAY field 与 null 值

Milvus 允许对包含 null 值的 ARRAY field 进行过滤。ARRAY field 在以下情况下被视为 null:

  • 整个 ARRAY field 被明确设置为 None(null),例如 "tags": None

  • ARRAY field 完全缺失。

ARRAY field 不能包含部分 null 值,因为 ARRAY field 中的所有元素必须具有相同的 data type。有关详细信息,请参考 Array Field

要进一步说明 Milvus 如何处理包含 null 值的 ARRAY field,请考虑以下示例数据,其中包含 ARRAY field tags

data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # 整个 ARRAY 为 null
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # 标签 field 完全缺失
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]

示例 1:查找 tags 为 null 的 entity

要查找 tags field 缺失或明确设置为 None 的 entity:

filter = 'tags IS NULL'

# 示例输出:
# 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 不为 null 的 entity

要查找 tags field 不为 null 的 entity:

filter = 'tags IS NOT NULL'

# 示例输出:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

使用基本操作符与 JSON 和 ARRAY field 的提示

虽然 Milvus 中的基本操作符在标量 field 上具有灵活性,但它们也可以有效地用于 JSON 和 ARRAY field 中的 keys 和 indexes。

例如,如果您有一个 product field,它包含多个 keys 如 pricemodeltags,请始终直接引用 key:

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

要查找记录,其中数组中记录的第一个温度超过一定值,请使用:

filter = 'history_temperatures[0] > 30'

结论

Milvus 提供了多种基本操作符,使您可以灵活地过滤和查询数据。通过结合比较、范围、算术和逻辑操作符,您可以创建强大的过滤表达式,以缩小搜索结果并高效地检索所需的数据。