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_with或IN也会失败。
如何修复
加上条件并固定一个值:
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 向量搜索指南。