DynamoDB 支援全文檢索嗎?

不,沒有原生支援。DynamoDB 沒有全文檢索:沒有相關性排序、沒有詞幹處理,也沒有模糊比對 — 內建的字串工具只有精確比較、排序索引鍵上的 begins_with,以及 contains 子字串篩選。AWS 給的答案是與 Amazon OpenSearch Service 的 zero-ETL 整合,它會把資料表複寫成一個搜尋索引,用於全文、向量與語意搜尋。

你原生能做到的事

  • 排序索引鍵上的 begins_with — 在單一分割區內做有效率的前綴比對;階層式排序索引鍵模型的骨幹。
  • 篩選運算式裡的 contains — 子字串比對,但篩選是在讀取_之後_才跑,所以在 Scan 上你仍然要為每一個被檢視的項目付讀取的錢。什麼時候這是可以接受的,請見篩選策略指南

兩者都不會替結果排名、不容忍打錯字,也不理解詞的邊界 — 它們是字串述詞,不是搜尋。

同一個查詢,四種寫法,實際量測

我們載入了 100 個帶產品標題的項目(84 KB),並掃描這張資料表四次,只更動搜尋詞:

篩選CountScannedCount讀取單位命中
contains(title, "run")310011Shoes for runs · Trail running shoe · Sneaker, runner grade
contains(title, "Run")210011Running shoes · Rungs for a ladder
contains(title, "running")110011Trail running shoe
contains(title, "runing")010011

把這幾列當成一個使用者在輸入框裡打字來讀。"run" 漏掉了 Running shoesRUNNING SHORTS,因為比較是區分大小寫的。"Run" 救回了 Running shoes,還是漏掉 RUNNING SHORTS,卻把 Rungs for a ladder 也拖了進來,因為子字串根本不曉得一個詞從哪裡開始。那個查詢無論怎麼變換大小寫,都找不齊那三個。少打一個字母,你就什麼都拿不到,因為沒有模糊比對可以降級退守。

最後一欄才是花錢的部分。每一次掃描都消耗了 11 個讀取單位,包括那個一筆都沒命中的,因為篩選是在讀取之後才跑。AWS 說得很白:"A filter expression is applied after a Scan finishes but before the results are returned. Therefore, a Scan consumes the same amount of read capacity, regardless of whether a filter expression is present." 他們自己對上面這種形態的診斷是:"A high ScannedCount value with few, or no, Count results indicates an inefficient Scan operation."

所以一次搜尋的價格追的是目錄的大小,從來不是查詢的具體程度。把這個接到隨打即搜的輸入框上,「running shoes」會對整張資料表計費十三次,一次一個按鍵,只為了回傳一個項目。

AWS 原生的答案:zero-ETL 到 OpenSearch

OpenSearch Ingestion 的 DynamoDB 外掛會把一張資料表同步到一個或多個 OpenSearch 索引:初始快照透過 DynamoDB 的 S3 匯出載入(需要 PITR),之後由 DynamoDB Streams 近乎即時地複寫變更。這條管線不消耗你資料表的任何讀取或寫入輸送量,所以擺在正式流量旁邊是安全的 — 而 AWS 明確說這項整合能對你的 DynamoDB 資料做全文、向量與語意搜尋。

深入了解

如果你的「搜尋」其實是一次已知的查找,那就改模型 — 篩選策略排序索引鍵策略兩份指南會告訴你索引鍵能做到什麼。可以在運算式建構器裡試做 begins_withcontains 條件,並下載 DynoTable 在探索時直接篩選線上資料表的資料。

參考資料

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

這四次掃描執行於 2026-07-28,環境為 DynamoDB Local 3.3.0、Node v24.18.0 上的 @aws-sdk/client-dynamodb 3.1095.0。CountScannedCount 與讀取單位都是引擎自己的數字。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。