DynamoDB 支援全文檢索嗎?
不,沒有原生支援。DynamoDB 沒有全文檢索:沒有相關性排序、沒有詞幹處理,也沒有模糊比對 — 內建的字串工具只有精確比較、排序索引鍵上的 begins_with,以及 contains 子字串篩選。AWS 給的答案是與 Amazon OpenSearch Service 的 zero-ETL 整合,它會把資料表複寫成一個搜尋索引,用於全文、向量與語意搜尋。
你原生能做到的事
- 排序索引鍵上的
begins_with— 在單一分割區內做有效率的前綴比對;階層式排序索引鍵模型的骨幹。 - 篩選運算式裡的
contains— 子字串比對,但篩選是在讀取_之後_才跑,所以在 Scan 上你仍然要為每一個被檢視的項目付讀取的錢。什麼時候這是可以接受的,請見篩選策略指南。
兩者都不會替結果排名、不容忍打錯字,也不理解詞的邊界 — 它們是字串述詞,不是搜尋。
同一個查詢,四種寫法,實際量測
我們載入了 100 個帶產品標題的項目(84 KB),並掃描這張資料表四次,只更動搜尋詞:
| 篩選 | Count | ScannedCount | 讀取單位 | 命中 |
|---|---|---|---|---|
contains(title, "run") | 3 | 100 | 11 | Shoes for runs · Trail running shoe · Sneaker, runner grade |
contains(title, "Run") | 2 | 100 | 11 | Running shoes · Rungs for a ladder |
contains(title, "running") | 1 | 100 | 11 | Trail running shoe |
contains(title, "runing") | 0 | 100 | 11 | 無 |
把這幾列當成一個使用者在輸入框裡打字來讀。"run" 漏掉了 Running shoes 與 RUNNING 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_with/contains 條件,並下載 DynoTable 在探索時直接篩選線上資料表的資料。
參考資料
- DynamoDB zero-ETL integration with Amazon OpenSearch Service — Amazon DynamoDB Developer Guide
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Comparison operator and function reference — Amazon DynamoDB Developer Guide
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。
這四次掃描執行於 2026-07-28,環境為 DynamoDB Local 3.3.0、Node v24.18.0 上的 @aws-sdk/client-dynamodb 3.1095.0。Count、ScannedCount 與讀取單位都是引擎自己的數字。