跳到主要内容
版本:v2.5.x

基本运算符

Milvus 提供丰富的基本运算符,帮助您高效地过滤和查询数据。这些运算符允许您根据标量字段、数字计算、逻辑条件等来完善搜索条件。了解如何使用这些运算符对于建立精确查询和最大限度地提高搜索效率至关重要。

比较运算符

比较运算符用于根据相等、不等或大小过滤数据。它们适用于数字和文本字段。

支持的比较运算符:

  • == 等于

  • != (不等于)

  • > 大于

  • < 小于

  • >= (大于或等于)

  • <= (小于或等于)

例 1:使用 "等于 "进行筛选 (==)

假设有一个名为 status 的字段,您想查找 status 为 "活动 "的所有实体。您可以使用相等运算符 ==

Python
filter = 'status == "active"'

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

查找 status 不是 "非活动 "的实体:

Python
filter = 'status != "inactive"'

例 3:使用大于 (>) 进行筛选

如果要查找 age 大于 30 的所有实体:

Python
filter = 'age > 30'

例 4:使用小于进行筛选

要查找 price 小于 100 的实体:

Python
filter = 'price < 100'

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

如果要查找 rating 大于或等于 4 的所有实体:

Python
filter = 'rating >= 4'

例 6:使用小于或等于进行筛选

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

Python
filter = 'discount <= 10'

范围运算符

范围运算符有助于根据特定的值集或范围过滤数据。

支持的范围运算符:

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

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

例 1:使用 IN 匹配多个值

如果要查找 color 为 "红色"、"绿色 "或 "蓝色 "的所有实体:

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

当您要检查值列表中的成员资格时,这很有用。

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

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

前缀匹配(以指定模式开头)

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

Python
filter = 'name LIKE "Prod%"'

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

后缀匹配(以指定模式结尾)

后缀 匹配中,如果字符串以给定的模式结尾,则将 % 符号放在模式的开头。例如,查找 name 以 "XYZ "结尾的所有产品:

Python
filter = 'name LIKE "%XYZ"'

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

中缀匹配(包含)

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

Python
filter = 'name LIKE "%Pro%"'

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

算术运算符

算术运算符允许您根据涉及数字字段的计算创建条件。

支持的算术运算符:

  • + 加法

  • - 减法

  • * 乘法

  • / 除法

  • % 取模

  • **

例 1:使用取模 (%)

查找 id 是偶数(即能被 2 整除)的实体:

Python
filter = 'id % 2 == 0'

例 2:使用幂运算 (**)

查找 price 的平方大于 1000 的实体:

Python
filter = 'price ** 2 > 1000'

逻辑运算符

逻辑运算符用于将多个条件组合成更复杂的过滤表达式。这些运算符包括 AND,OR, 和 NOT

支持的逻辑运算符:

  • AND:组合必须全部为真的多个条件。

  • OR:组合至少一个必须为真的条件。

  • NOT:否定一个条件。

例 1:使用 AND 合并条件

查找 price 大于 100 且 stock 大于 50 的所有产品:

Python
filter = 'price > 100 AND stock > 50'

例 2:使用 OR 合并条件

查找 color 为 "红色 "或 "蓝色 "的所有产品:

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

例 3:使用 NOT 排除条件

查找 color 不是 "绿色 "的所有产品:

Python
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 字段为空值的实体:

Python
filter = 'description IS NULL'

检索 description 字段不是空值的实体:

Python
filter = 'description IS NOT NULL'

检索 description 字段不是空值且 price 字段大于 10 的实体:

Python
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 的示例数据:

Python
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 为空的实体

查找 metadata 字段丢失或明确设置为 "无 "的实体:

Python
filter = 'metadata IS NULL'

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

例 2:检索 metadata 不为空的实体

查找 metadata 字段不是空值的实体:

Python
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 字段不能包含部分空值,因为 ARRAY 字段中的所有元素必须具有相同的数据类型。有关详细信息,请参阅 数组字段

为进一步说明 Milvus 如何处理带有空值的 ARRAY 字段,请考虑以下带有 ARRAY 字段 tags 的示例数据:

Python
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 为空的实体

检索 tags 字段丢失或明确设置为 None 的实体:

Python
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 字段不为空的实体:

Python
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 字段包含多个键,如 pricemodeltags,则始终直接引用键:

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

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

Python
filter = 'history_temperatures[0] > 30'

结论

Milvus 提供了一系列基本运算符,让您可以灵活地过滤和查询数据。通过结合比较、范围、算术和逻辑运算符,您可以创建功能强大的过滤表达式,从而缩小搜索结果的范围,并高效检索所需的数据。