当前位置: 首页 > article >正文

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}")

http://www.kler.cn/a/579592.html

相关文章:

  • 二维码识别OCR接口:开启高效信息提取的新篇章
  • RK Android14 在计算器内输入特定字符跳转到其他应用
  • 文件上传漏洞测试
  • Java 大视界 -- Java 大数据在智慧交通信号灯智能控制中的应用(116)
  • TCP/IP 5层协议簇:网络层(ICMP协议)
  • 论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)
  • 自学微信小程序的第十二天
  • lodash手写源码-cloneDeep,debounce,throttle
  • 【并发】 synchronized 关键字详解
  • 实现一键不同环境迁移ES模板
  • Mysql配置文件My.cnf(my.ini)配置参数说明
  • 如何判断住宅IP与机房IP的方法
  • 双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开
  • vue基本功
  • ubuntu22.04安装RAGFlow配合DeepSeek搭建本地知识库
  • 论文阅读_角色扮演综述从人格化到个性化
  • leetcode 2070. 每一个查询的最大美丽值 中等
  • 物联网中如何解决数据安全的问题
  • 【网络安全 | 漏洞挖掘】通过JWT的IDOR实现账户接管
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_modules