过滤表达式

使用过滤表达式,借助 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 调整召回率与性能的平衡。
  • 组合多个属性进行细粒度过滤。

另请参阅

为此页评分
返回顶部 ↑
© . This site is unofficial and not affiliated with Redis, Inc.