4

내 React 응용 프로그램에서 검색 기능을 만들려고합니다.DynamoDB에서 "contains"를 사용하여 검색하는 방법

--------------------- 
movie_id | movie_name 
--------------------- 
1  | name a 
--------------------- 
2  | name b 
--------------------- 

내가 반작용 응용 프로그램의 검색 입력의 "B"를 검색하고 결과로 DB에서 "이름 B"를 얻을 수있는 검색 기능을 만들고 싶어 :

나는이 DynamoDB의 테이블이 있습니다.

CONTAINS으로 시도했으나 제대로 작동하지 않았으며 올바른 방법이 아닌 것으로 보입니다.

const SEARCH_KEYWORD = "b"; 

let params = { 
    TableName : 'TABLE_NAME', 
    KeyConditionExpression: "contains(#movie_name, :movie_name)", 
    ExpressionAttributeNames:{ 
    "#movie_name": 'movie_name' 
    }, 
    ExpressionAttributeValues:{ 
     ":movie_name": SEARCH_KEYWORD 
    } 
}; 
documentClient.query(params, function(err, data) { 
    console.log(data); 
}); 

DynamoDB의 내 반작용 응용 프로그램에 검색 기능을 만들 수있는 가장 좋은 방법은 무엇입니까?

검색 키워드로 쿼리를 실행하여 데이터에 키워드 값이 포함되어 있는지 확인하는 것이 의미가 있습니까?

답변

3

CONTAINS 연산자는 query API에서 사용할 수 없습니다. 이 경우 scan API를 사용해야합니다 (see this link).

는 다음과 같은 시도 :

const AWS = require('aws-sdk'); 
const documentClient = new AWS.DynamoDB.DocumentClient(); 
const SEARCH_KEYWORD = "b"; 

let params = { 
    TableName : 'TABLE_NAME', 
    FilterExpression: "contains(#movie_name, :movie_name)", 
    ExpressionAttributeNames: { 
     "#movie_name": "movie_name", 
    }, 
    ExpressionAttributeValues: { 
     ":movie_name": SEARCH_KEYWORD, 
    }  
}; 

documentClient.scan(params, function(err, data) { 
    console.log(data); 
}); 

결과 :

{ 
    Items: [ 
     { 
      movie_id: 2, 
      movie_name: 'name b' 
     } 
    ], 
    Count: 1, 
    ScannedCount: 2 
} 
+0

너무 감사합니다! 그것은 작동합니다! 또 하나의 질문은 검색 기능을 구축하는 이상적인 방법일까요? 또는 이것을 할 수있는 더 좋은 방법이 있습니까? – Ohsik

+0

@Ohsik, "contains"로 검색하는 것은 항상 테이블의 전체 스캔을 요구하기 때문에 절대로 적합하지 않습니다. 많은 양의 데이터가있는 경우 성능 문제가 발생할 수 있습니다. 그러나 이름이 "beginning with"인지 확인하는 것이'query' API와 함께 사용될 수 있고 인덱스로부터 이익을 얻습니다. 그러면 성능이 크게 향상됩니다. 그러나 분명히 "시작"은 "포함"과 다릅니다. – Zanon

+0

@ Ohhik, 수백만 행의 "포함"을 사용해야하는 경우 [Elasticsearch] (https://aws.amazon.com/elasticsearch-service/) DynamoDB와의 통합을 검토하는 것이 좋습니다. – Zanon