SearchConditionExpression must be provided when SearchSchema has a HASH key

TL;DR — 这个向量索引是带着一个 HASH 搜索模式属性创建的,这让分区过滤成为强制项。每次 SearchVectors 调用都必须用等值条件为它固定恰好一个值;不存在"搜索所有分区"模式。

含义

ValidationException: SearchConditionExpression must be provided when SearchSchema has a HASH key

这是我们在 us-east-1 捕获的服务端原样响应:对一个定义了 HASH 元素的索引省略了该条件。这个选择在索引创建时就已做出:HASH 键会给索引分区,从那之后每次搜索的范围都被限定在恰好一个分区值内。

为什么会发生

  • 条件完全缺失——最常见的情形是,针对无搜索模式索引编写的代码被指向了一个带 HASH 键的索引。
  • 表达式没有固定 HASH 属性——只在某个 INLINE_FILTER 属性上过滤并不满足这一要求。
  • 表达式用了等值以外的任何东西——SearchConditionExpression 只接受 =,所以在分区属性上用 begins_withIN 也会失败。

如何修复

加上条件并固定一个值:

aws dynamodb search-vectors \
  --table-name SupportTickets \
  --index-name TicketEmbeddings \
  --search-vector file://query-vector.json \
  --top-k 10 \
  --search-condition-expression "product = :p" \
  --expression-attribute-values '{":p": {"S": "checkout"}}'

如果你的访问模式确实需要跨分区搜索,索引就必须在创建时不带 HASH 元素——搜索模式是不可变的,所以这意味着一个新索引。并且要把这个键当作路由选择,而不是安全边界:精细访问控制不适用于 SearchVectors

相关内容

一个 HASH 键给你带来什么(吞吐扩展、更便宜的搜索)、又让你付出什么:见 DynamoDB 向量搜索指南

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。