过滤表达式
使用过滤表达式,借助 Redis 矢量集合优化矢量相似性结果
概述
过滤搜索允许您结合矢量相似性搜索与标量过滤。您可以将 JSON 属性关联到矢量集合中的元素,然后在 VSIM 查询期间使用这些属性过滤结果。
这支持诸如...
VSIM movies VALUES 3 0.5 0.8 0.2 FILTER '.year >= 1980 and .rating > 7'
分配属性
添加新矢量时,您可以使用 SETATTR 参数关联属性
VADD vset VALUES 3 1 1 1 a SETATTR '{"year": 1950}'
或者稍后使用 VSETATTR 命令更新它们
VSETATTR vset a '{"year": 1960}'
您可以使用 VGETATTR 命令检索属性
VGETATTR vset a
相似性搜索期间的过滤
要按属性过滤,请将 FILTER 选项传递给 VSIM 命令
VSIM vset VALUES 3 0 0 0 FILTER '.year > 1950'
这仅返回既匹配矢量相似性又匹配过滤表达式的元素。
表达式语法
表达式支持熟悉的类似 JavaScript 的语法
- 算术运算:
+,-,*,/,%,** - 比较运算:
==,!=,>,<,>=,<= - 逻辑运算:
and,or,not(或&&,||,!) - 包含运算:
in - 分组:括号
()
使用点表示法访问属性字段,例如 .year, .rating。
仅支持顶层字段(例如
.genre,但不支持.movie.genre)。
支持的数据类型
- 数字
- 字符串
- 布尔值(转换为 1 或 0)
- 数组(用于
in)
如果字段缺失或无效,该元素将被跳过且不报错。
FILTER-EF
FILTER-EF 选项控制引擎检查多少候选节点以找到足够的过滤结果。默认值为 COUNT * 100。
VSIM vset VALUES 3 0 0 0 COUNT 10 FILTER '.year > 2000' FILTER-EF 500
- 处理稀有过滤条件时,请使用更高的值。
- 使用
FILTER-EF 0扫描所需数量以满足请求。 - 如果找到了足够的高质量结果,引擎将提前停止。
示例
# Filter by year range
VSIM movies VALUES 3 0.5 0.8 0.2 FILTER '.year >= 1980 and .year < 1990'
# Filter by genre and rating
VSIM movies VALUES 3 0.5 0.8 0.2 FILTER '.genre == "action" and .rating > 8.0'
# Use IN with array
VSIM movies VALUES 3 0.5 0.8 0.2 FILTER '.director in ["Spielberg", "Nolan"]'
# Math and logic
VSIM movies VALUES 3 0.5 0.8 0.2 FILTER '(.year - 2000) ** 2 < 100 and .rating / 2 > 4'
提示
- 缺失的属性被视为不匹配。
- 使用
FILTER-EF调整召回率与性能的平衡。 - 组合多个属性进行细粒度过滤。