跳到主要内容

基本操作符

Zilliz Cloud 提供了一套丰富的基本操作符,可帮助您高效地过滤和查询数据。通过这些操作符,您可以根据标量字段、数字计算、逻辑条件等细化搜索条件。了解如何使用这些操作符对于建立精确查询和最大限度地提高搜索效率至关重要。

比较操作符

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

支持的比较操作符

  • ==(等于)

  • !=(不等于)

  • >(大于)

  • <(小于)

  • >=(大于等于)

  • <=(小于等于)

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

假设有名为 status 的字段,需要过滤出 status 字段值为 active 的所有 Entity,可以使用如下过滤表达式:

filter = 'status == "active"'

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

如果需要过滤出 status 字段值不为 active 的所有 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:用于过滤出某字段的值在指定范围内的所有 Entity。

  • LIKE:用于过滤出某字段的值匹配指定模式的所有 Entity。

示例1:使用 IN操作符匹配多个指定值

如果需要过滤出 color 字段中包含了 redgreenblue 的所有 Entity,可以使用如下表达式:

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

这对于希望检查某参数值是否在某个指定范围来说十分有用。

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

对于文本字段来说,可以使用 LIKE 操作符对其进行模式匹配。具体来说,您可以检查某个文本字段的值是否在前缀、后缀或中缀等指定位置上包含某个子字符串。在 LIKE 操作符中,您可以使用 % 作为通配符,用于匹配零个或多个字符。

前缀匹配

如果需要进行前缀匹配,可以将 % 通配符放在需要匹配的子字符串的后面。如下面的例子所示,如果需要找出 name 字段值以 Prod 开头的所有 Entity,可以使用如下过滤表达式。

filter = 'name LIKE "Prod%"'

This will match any product whose name starts with "Prod", such as "Product A", "Product B", etc.

该过滤表达式将匹配 name 字段值为 ProductAProductB 等以 Prod 开头的所有 Entity。

后缀匹配

对于后缀匹配来说,可以将 % 通配符放在需要匹配的子字符串的前面。例如,需要找出 name 字段以 XYZ 结尾的所有 Entity,可以使用如下过滤表达式。

filter = 'name LIKE "%XYZ"'

该过滤表达式将匹配 name 字段值为 ProductXYZSampleXYZ 等以 XYZ 结尾的所有 Entity。

中缀匹配

进行中缀匹配,也就是匹配那些包含指定模式文本的字段值,可以在模式文本前后都加上一个 % 通配符。例如,需要找出 name 字段包含了 Pro 字样的所有 Entity,可以使用如下过滤表达式:

filter = 'name LIKE "%Pro%"'

该过滤表达式将匹配 name 字段值为 ProductProLineSuperPro 等包含了 Pro 字符串的所有 Entity。

算术操作符

您可以使用算术操作符根据涉及数值字段的算术计算式创建过滤条件。

支持的算术操作符

  • +(加)

  • -(减)

  • *(乘)

  • /(除)

  • %(余)

  • **(幂)

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

可以使用如下过滤表达式找出 id 字段值为偶数的所有 Entity。

filter = 'id % 2 == 0'

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

可以使用如下过滤表达式找出所有 price 字段值的平方大于 1000 的所有 Entity。

filter = 'price ** 2 > 1000'

逻辑操作符

逻辑操作符通常用来连接多个过滤条件以实现复杂的过滤条件,包括 ANDORNOT

支持的逻辑操作符

  • AND:连接多个过滤条件,每个条件都为真时为真。

  • OR:连接多个过滤条件,其中一个条件为真时为真。

  • NOT:后接一个过滤条件,当该条件为假时为真。

示例 1:使用 AND 操作符连接多个条件

可以使用如下过滤表达式找出 price 字段值大于 100stock 字段值大于 50 的所有 Entity。

filter = 'price > 100 AND stock > 50'

示例 2:使用 OR 操作符连接多个条件

可以使用如下过滤表达式找出 color 字段值为 redblue 的所有 Entity。

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

示例 3:使用 NOT 操作符排除某个条件

可以使用如下过滤表达式找出所有 color 字段值不为 green 的所有 Entity。

filter = 'NOT color == "green"'

IS NULL 和 IS NOT NULL 操作符

IS NULLIS NOT NULL 操作符用来根据某个 Entity 指定字段的取值是否为 null (即值为空)进行过滤。

  • IS NULL 判断 Entity 中指定字段的取值是否为 null,即为空或未定义。

  • IS NOT NULL 判断 Entity 中指定字段的取值不为空,即 Entity 在该字段上的值为一个合法的值。

📘说明

此操作符大小写不敏感。因此,IS NULLis nullIS NOT NULLis not null 均合法。

普通标量字段中的 Null 值

Zilliz Cloud 支持针对普通标量字段是否为空进行过滤。这些字段类型包括字段串或数值类型等。

📘说明

VARCHAR 类型的字段中,Zilliz Cloud 不会将 "" 识别为 nulll 值。

如下过滤表达式可以过滤出 description 字段为空的 Entity。

filter = 'description IS NULL'

如下过滤表达式可以过滤出 description 字段不为空的 Entity。

filter = 'description IS NOT NULL'

如下过滤表达式可以过滤出 description 字段为空且 price 字段大于 10 的 Entity。

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

JSON 字段中的 Null 值

Zilliz Cloud 支持针对 JSON 字段是否为空进行过滤,并将符合如下条件的 JSON 字段判定为 null

  • JSON 字段的值显式定义为 None,如 {"metadata": None}

  • Entity 中未包含该 JSON 字段。

📘说明

如果 JSON 字段值中某些元素(例如,某些键值)为 null,该字段的值仍为非空。例如,某 Entity 的 JSON 字段的取值为 {"metadata": {"category": None, "price": 99.99}} 中。虽然 category 的值为 None,但该 JSON 字段的取值不会被当作 null

为了更好地演示 Zilliz Cloud 如何处理允许为空的 JSON 字段,我们将使用如下数据结合相关示例进行说明:

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 为空的 Entity

只有当不存在 metadata 字段或该字段显式设置为 None 时,才会被认定为 null

filter = 'metadata IS NULL'

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

示例 2:获取 metadata 为非空的 Entity

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 字段中的 Null 值

Zilliz Cloud 支持针对 ARRAY 字段是否为空进行过滤,并将符合如下条件的 ARRAY 字段判定为 null

  • ARRAY 字段的值显式定义为 None,如 {"metadata": None}

  • Entity 中未包含该 JSON 字段。

📘说明

由于 ARRAY 字段中各元素的数值类型需要保持一致,因此 ARRAY 字段不支持部分元素值为 null。具体可参考Array 类型

为了更好地演示 Zilliz Cloud 如何处理允许为空的 ARRAY 字段,我们将使用如下数据结合相关示例进行说明:

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 为空的 Entity

只有当不存在 tags 字段或该字段显式设置为 None 时,才会被认定为 null

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 为非空的 Entity

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,您可以使用这些键名构建过滤条件表达式来实现针对这些键值的过滤。如下示例可以找出 product 字段中 price 键值大于 1000 的所有 Entity。

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

您还可以使用如下过滤表达式找出 history_temperatures 中第一个记录大于 30 的所有 Entity。

filter = 'history_temperatures[0] > 30'

小结

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