基本操作符

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 和正则表达式之间进行选择、支持的字段类型、正则表达式语法、转义规则以及性能的更多详细信息,请参阅“模式匹配”。Milvus还允许您在VARCHAR 字段或JSON字符串路径上构建NGRAM 索引,以加速符合条件的模式匹配过滤器。有关详细信息,请参阅“NGRAM”。

算术操作符

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

支持的算术操作符

  • + (加法)

  • - (减法)

  • * (乘法)

  • / (除法)

  • % (取模)

  • ** (幂运算)

例 1:使用取模运算(% )

求满足id 为偶数(即能被2整除)的数:

filter = 'id % 2 == 0'

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

查找满足“price ”的2次幂大于1000的实体:

filter = 'price ** 2 > 1000'

算术操作符仅支持涉及单个字段和常量的表达式。将两个字段进行算术操作的表达式(例如price * quantity > 100 )目前不被支持,并将返回错误。如果您需要根据由多个字段计算得出的派生值进行筛选,请考虑在插入时将预先计算好的值作为单独的标量字段进行存储。

位操作符Compatible with Milvus 3.0.0+

当整数字段编码了多个标志(例如权限、功能标志或状态位)时,位操作符非常有用。您可以在筛选表达式中使用这些操作符来检查、组合或比较整数值中的单个位。

对于标量字段,位运算符适用于整数字段类型,例如INT8 、INT16 、INT32 和INT64 。

支持的位操作符

操作符名称典型用法
&位与检查特定位是否被置位。
|位或在比较前对位进行组合。
^位异或比较两个值之间的位差异。

示例:按权限位进行过滤

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

权限标志位值
READ1
WRITE2
SHARE4
ADMIN8

例如,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 不是“green”的产品:

filter = 'NOT color == "green"'

IS NULL 和 IS NOT NULL 操作符

IS NULL 和IS NOT NULL 操作符用于根据字段是否包含空值(无数据)来筛选字段。

  • IS NULL: 识别特定字段包含空值的实体,即该字段无值或未定义。

  • IS NOT NULL: 识别特定字段包含其他非空值的实体,即该字段具有有效且已定义的值。

这些操作符不区分大小写,因此您可以使用IS NULL 或is null ,以及IS NOT NULL 或is not null 。

包含 null 值的常规标量字段

Milvus 允许对包含空值的常规标量字段(如字符串或数字)进行过滤。

对于VARCHAR 字段,空字符串"" 不会被视为空值。

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

filter = 'description IS NULL'

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

filter = 'description IS NOT NULL'

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

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

包含空值的 JSON 字段

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

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

  • 该 JSON 字段在实体中完全缺失。

如果 JSON 对象中的某些元素为 null(例如单个键),则该字段仍被视为非 null。例如,\{"metadata": \{"category": None, "price": 99.99}} 不会被视为 null,即使category 键为 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 ` 字段不为空的实体:

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(空),例如"tags": None 。

  • 实体中完全缺少该 ARRAY 字段。

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

为进一步说明 Milvus 如何处理包含空值的 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` 为空的实体

要检索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 并未对过滤条件中的匹配值列表长度设置限制。但是,过长的列表会显著影响查询性能。 如果您的过滤条件包含冗长的匹配值列表或包含多个元素的复杂表达式,建议使用“过滤模板”功能来提升查询性能。