跳到主要内容

基本操作符

Zilliz Cloud 提供了丰富的基本操作符,可帮助您高效过滤和查询数据。您可以使用这些操作符,根据标量字段、数值计算、逻辑条件等细化搜索条件。掌握这些操作符的用法,是构建精确查询并提升搜索效率的关键。

说明

过滤表达式左侧的值既可以是 Collection 字段名称(例如下文示例中的 statuscolor 等),也可以是指定元素索引处的 StructArray 子字段名称,例如 filter = 'struct[0][subfield] > 10'

有关 StructArray 字段中标量过滤的详细信息,请参阅 StructArray 操作符

比较操作符

比较操作符用于根据相等、不等或大小关系过滤数据,适用于数值字段和文本字段。

支持的比较操作符

  • ==(等于)

  • !=(不等于)

  • >(大于)

  • <(小于)

  • >=(大于或等于)

  • <=(小于或等于)

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

假设有一个名为 status 的字段,您需要查找 status 为 "active" 的所有实体。可以使用等于操作符 ==

python
filter = 'status == "active"'

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

要查找 status 不为 "inactive" 的实体:

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'

范围操作符

范围操作符用于根据一组特定值过滤数据。Zilliz Cloud 支持使用 IN 检查值是否属于指定集合。

要查找 color 为 "red"、"green" 或 "blue" 的所有实体:

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

需要检查某个值是否属于值列表时,这种方法非常有用。

模式匹配操作符

模式匹配操作符用于根据通配符模式或正则表达式过滤字符串值。

  • LIKE:用于匹配字符串值中的简单通配符模式。例如,name LIKE "Prod%" 可以匹配以 Prod 开头的值。

  • =~:使用 RE2 正则表达式匹配字符串值。例如,code =~ "E[0-9]{4}" 可以匹配包含 E1001 等错误代码的值。

  • !~:排除与 RE2 正则表达式匹配的字符串值,等同于 NOT (field =~ "pattern")

要查找 nameProd 开头的实体:

python
filter = 'name LIKE "Prod%"'

要查找 code 中包含 E1001 等错误代码的实体:

python
filter = 'code =~ "E[0-9]{4}"'

要排除 messageDEBUG 开头的实体:

python
filter = 'message !~ "^DEBUG"'

有关如何选择 LIKE 或正则表达式,以及支持的字段类型、正则表达式语法、转义规则和性能等详细信息,请参阅模式匹配。Zilliz Cloud 还支持在 VARCHAR 字段或 JSON 字符串路径上构建 NGRAM 索引,以加速符合条件的模式匹配过滤。有关详细信息,请参阅 NGRAM

算术操作符

算术操作符用于根据数值字段的计算结果构建过滤条件。

支持的算术操作符

  • +(加法)

  • -(减法)

  • *(乘法)

  • /(除法)

  • %(取模)

  • **(幂运算)

示例 1:使用取模(%)操作符

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

python
filter = 'id % 2 == 0'

示例 2:使用幂运算(**)操作符

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

python
filter = 'price ** 2 > 1000'

按位操作符

当整数值用于编码权限、功能开关或状态位等多个标志时,按位操作符非常有用。您可以在过滤表达式中使用这些操作符,检查、组合或比较整数值中的各个位。

对于标量字段,按位操作符适用于 INT8INT16INT32INT64 等整数字段类型。

支持的按位操作符

操作符名称典型用途
&按位与检查特定位是否已设置。
|按位或在比较前组合多个位。
^按位异或比较两个值之间不同的位。

示例:按权限位过滤

假设有一个名为 permissions 的整数字段,其中每一位分别代表一个权限标志:

权限标志位值
READ1
WRITE2
SHARE4
ADMIN8

例如,permissions = 5 表示 READSHARE 位已设置,因为 5 = 1 + 4

要查找已设置 SHARE 位的实体,请使用按位与(&):

python
filter = "(permissions & 4) == 4"

要查找设置 WRITE 位后得到 READ + WRITE + SHARE 权限组合的实体,请使用按位或(|):

python
filter = "(permissions | 2) == 7"

要查找权限位与 READ + WRITE + SHARE 仅相差 WRITE 位的实体,请使用按位异或(^):

python
filter = "(permissions ^ 7) == 2"

注意:在比较结果前,始终需要用括号包裹按位运算,例如 (permissions & 4) == 4

逻辑操作符

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

支持的逻辑操作符

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

  • OR:组合多个条件,其中至少一个条件必须为真。

  • NOT:对条件取反。

示例 1:使用 AND 组合条件

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

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

示例 2:使用 OR 组合条件

要查找 color 为 "red" 或 "blue" 的所有产品:

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

示例 3:使用 NOT 排除条件

要查找 color 不为 "green" 的所有产品:

python
filter = 'NOT color == "green"'

IS NULL 和 IS NOT NULL 操作符

IS NULLIS NOT NULL 操作符用于根据字段是否包含 null 值(即缺少数据)进行过滤。

  • IS NULL:查找指定字段包含 null 值(即值缺失或未定义)的实体。

  • IS NOT NULL:查找指定字段包含 null 以外的任意值(即字段具有有效定义值)的实体。

说明

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

包含 Null 值的常规标量字段

Zilliz Cloud 支持对包含 null 值的常规标量字段(例如字符串或数值字段)进行过滤。

说明

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

要检索 description 字段为 null 的实体:

python
filter = 'description IS NULL'

要检索 description 字段不为 null 的实体:

python
filter = 'description IS NOT NULL'

要检索 description 字段不为 null 且 price 字段大于 10 的实体:

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

包含 Null 值的 JSON 字段

Zilliz Cloud 支持对包含 null 值的 JSON 字段进行过滤。在以下情况下,JSON 字段会被视为 null:

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

  • Entity 中完全缺少该 JSON 字段。

说明

如果 JSON 对象中的部分元素(例如单个键)为 null,该字段仍会被视为非 null。例如,\{"metadata": \{"category": None, "price": 99.99}} 不会被视为 null,即使其中的 category 键为 null。

为了进一步说明 Zilliz Cloud 如何处理包含 null 值的 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 为 null 的实体

要查找 metadata 字段缺失或被显式设置为 None 的实体:

python
filter = 'metadata IS NULL'

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

示例 2:检索 metadata 不为 null 的实体

要查找 metadata 字段不为 null 的实体:

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}"
# ]

包含 Null 值的 ARRAY 字段

Zilliz Cloud 支持对包含 null 值的 ARRAY 字段进行过滤。在以下情况下,ARRAY 字段会被视为 null:

  • 整个 ARRAY 字段被显式设置为 None(null),例如 "tags": None

  • Entity 中完全缺少该 ARRAY 字段。

说明

ARRAY 字段不能包含部分 null 值,因为 ARRAY 字段中的所有元素必须具有相同的数据类型。有关详细信息,请参阅 Array 类型

为了进一步说明 Zilliz Cloud 如何处理包含 null 值的 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 为 null 的实体

要检索 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 不为 null 的实体

要检索 tags 字段不为 null 的实体:

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 字段中使用基本操作符的注意事项

Zilliz Cloud 集群 中的基本操作符用途广泛,不仅适用于标量字段,也可以有效应用于 JSON 和 ARRAY 字段中的键和索引。

例如,如果 product 字段包含 pricemodeltags 等多个键,应始终直接引用目标键:

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

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

python
filter = 'history_temperatures[0] > 30'

总结

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

常见问题

过滤条件中的匹配值列表是否有长度限制(例如 filter='color in ["red", "green", "blue"]')?列表过长时应该怎么办?

Zilliz Cloud 不限制过滤条件中匹配值列表的长度。但是,列表过长会显著影响查询性能。 如果过滤条件包含很长的匹配值列表,或包含大量元素的复杂表达式,建议使用过滤表达式模板来提升查询性能。