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." 위와 같은 형태에 대한 AWS 자신의 진단은 이렇습니다: "A high ScannedCount value with few, or no, Count results indicates an inefficient Scan operation."
그러므로 검색의 값은 쿼리의 구체성이 아니라 카탈로그의 크기를 따라갑니다. 이것을 입력하는 대로 검색되는 창에 연결하면, "running shoes"는 항목 하나를 돌려주려고 키 입력마다 한 번씩, 테이블 전체를 열세 번 청구합니다.
AWS 네이티브 해법: OpenSearch로 가는 zero-ETL
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
위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.
네 번의 스캔은 2026-07-28에 Node v24.18.0 위의 @aws-sdk/client-dynamodb 3.1095.0으로 DynamoDB Local 3.3.0에 대해 실행했습니다. Count, ScannedCount, 읽기 단위는 엔진이 내놓은 수치 그대로입니다.