SearchConditionExpression must be provided when SearchSchema has a HASH key
TL;DR — 這個向量索引建立時帶了一個 HASH search-schema 屬性,這使得分割區過濾成為必填。每一次 SearchVectors 呼叫都必須用一個等值條件為它釘死恰好一個值;沒有「搜尋所有分割區」模式。
這是什麼意思
ValidationException: SearchConditionExpression must be provided when SearchSchema has a HASH key這是我們在 us-east-1 擷取到的服務原文回應:對一個定義了 HASH 元素的索引省略了條件。這個選擇在索引建立時就做定了:HASH 鍵把索引分了區,從那之後每一次搜尋都被限定在恰好一個分割區值內。
為什麼會發生
- 條件完全缺失——最常見的情況:針對一個沒有 search schema 的索引寫的程式碼,被指向了一個帶
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 元素——search schema 是不可變的,所以那意味著一個新索引。另外,把這個鍵當作一個路由選擇,而不是安全邊界:精細的存取控制不適用於 SearchVectors。
相關內容
一個 HASH 鍵能為你買到什麼(吞吐量擴展、更便宜的搜尋)、又要付出什麼代價:見 DynamoDB 向量搜尋指南。