Milvus的匹配语法
一、基础比较运算符
适用于数值、字符串、布尔等标量字段。
运算符 | 说明 | 示例表达式 | 适用字段类型 |
---|---|---|---|
== | 等于 | age == 25 | 数值、字符串、布尔 |
!= | 不等于 | name != "Unknown" | 数值、字符串、布尔 |
> | 大于 | price > 100.5 | 数值 |
>= | 大于等于 | rating >= 4.0 | 数值 |
< | 小于 | timestamp < 1630454400 | 数值 |
<= | 小于等于 | quantity <= 50 | 数值 |
二、逻辑运算符
用于组合多个条件。
运算符 | 说明 | 示例表达式 |
---|---|---|
AND | 逻辑与 | age > 18 AND gender == "male" |
OR | 逻辑或 | category == "book" OR category == "movie" |
NOT | 逻辑非 | NOT (status == "deleted") |
() | 优先级控制 | (age < 30 OR age > 50) AND income > 10000 |
三、字符串匹配
用于模糊匹配或正则表达式。
语法 | 说明 | 示例表达式 |
---|---|---|
LIKE | 简单模糊匹配 | title LIKE "Milvus%" |
NOT LIKE | 排除模糊匹配 | email NOT LIKE "%@spam.com" |
match (全文检索) | 文本分词匹配 | content MATCH "database engine" |
LIKE
通配符说明:
• %
:匹配任意长度字符(包括空字符)。
• _
:匹配单个字符。
• 示例:name LIKE "J%n"
匹配 “John”、“Juan” 等。
四、数组操作
用于检查数组字段中的元素。
语法 | 说明 | 示例表达式 |
---|---|---|
ARRAY_CONTAINS | 包含特定元素 | tags ARRAY_CONTAINS "AI" |
ARRAY_CONTAINS_ANY | 包含任意指定元素 | tags ARRAY_CONTAINS_ANY ["AI", "DB"] |
ARRAY_LENGTH | 数组长度匹配 | ARRAY_LENGTH(tags) >= 3 |
五、空值判断
用于检查字段是否为 NULL
或非空。
语法 | 说明 | 示例表达式 |
---|---|---|
IS NULL | 字段为空 | description IS NULL |
IS NOT NULL | 字段非空 | description IS NOT NULL |
六、时间日期处理
适用于时间戳字段(需存储为 INT64
或 STRING
类型)。
示例 1:时间范围查询
expr = "timestamp >= 1630454400 AND timestamp <= 1633046400" # 2021-09-01 至 2021-10-01
示例 2:日期字符串匹配
expr = 'date_str LIKE "2023-05-%"' # 匹配 2023 年 5 月所有日期
七、结合向量搜索的混合查询
在向量搜索(search
)中同时过滤标量字段。
示例代码:
# 搜索条件:向量相似度 + 标量过滤
results = collection.search(
data=[[0.1, 0.2, 0.3]], # 查询向量
anns_field="vector", # 向量字段名
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=10,
expr="category == 'book' AND price < 50", # 标量过滤条件
output_fields=["id", "title", "price"]
)
八、复杂表达式示例
示例 1:多条件组合
expr = '''
(age >= 18 AND age <= 35)
AND
(city == "Shanghai" OR city == "Beijing")
AND
NOT (occupation == "student")
'''
示例 2:嵌套数组与逻辑操作
expr = '''
ARRAY_CONTAINS(tags, "AI")
AND
(ARRAY_LENGTH(tags) > 2 OR rating >= 4.5)
'''
九、注意事项
- 字段类型匹配:确保操作符与字段类型兼容(例如,不可对数值字段使用
LIKE
)。 - 性能影响:复杂表达式可能降低查询速度,尽量先过滤再搜索。
- 索引优化:对频繁过滤的字段(如
category
)创建标量索引(STL_SORT
或MARISA-TRIE
)。 - 表达式长度:Milvus 2.x 对
expr
长度有限制(默认 4096 字节),避免过长表达式。
十、完整示例流程
假设有一个集合 products
,包含以下字段:
• id
(INT64, 主键)
• vector
(FLOAT_VECTOR, 维度 128)
• name
(STRING)
• price
(FLOAT)
• tags
(ARRAY)
场景:搜索价格低于 100 元且包含 “electronics” 标签的相似商品
# 表达式
expr = "price < 100 AND ARRAY_CONTAINS(tags, 'electronics')"
# 执行搜索
results = collection.search(
data=[[0.5, 0.3, ..., 0.8]], # 查询向量
anns_field="vector",
param={"metric_type": "IP", "params": {"nprobe": 10}},
limit=5,
expr=expr,
output_fields=["id", "name", "price"]
)
# 输出结果
for hits in results:
for hit in hits:
print(f"ID: {hit.id}, Name: {hit.entity.get('name')}, Score: {hit.score}")