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

六、时间日期处理

适用于时间戳字段(需存储为 INT64STRING 类型)。

示例 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)
'''

九、注意事项

  1. 字段类型匹配:确保操作符与字段类型兼容(例如,不可对数值字段使用 LIKE)。
  2. 性能影响:复杂表达式可能降低查询速度,尽量先过滤再搜索。
  3. 索引优化:对频繁过滤的字段(如 category)创建标量索引(STL_SORTMARISA-TRIE)。
  4. 表达式长度: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}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

堕落年代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值