如何在DynamoDB中使用“包含”进行搜索

Ohs*_*sik 5 javascript amazon-web-services amazon-dynamodb reactjs serverless-framework

我正在尝试在我的React应用程序上执行搜索功能。

我有此DynamoDB表:

---------------------
movie_id | movie_name
---------------------
1        | name a
---------------------
2        | name b
---------------------
Run Code Online (Sandbox Code Playgroud)

我想要一个搜索功能来搜索React应用程序的搜索输入中的“ b”,并从数据库中获取“名称b”。

我尝试过但没有query用,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);
});
Run Code Online (Sandbox Code Playgroud)

使用DynamoDB在React应用上创建搜索功能的最佳方法是什么?

通过搜索关键字运行查询以检查数据是否包含关键字值甚至有意义吗?

Zan*_*non 11

CONTAINS运算符在queryAPI 中不可用。您需要为此使用scanAPI(请参阅此链接)。

请尝试以下操作:

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);
});
Run Code Online (Sandbox Code Playgroud)

结果:

{ 
    Items: [ 
        { 
            movie_id: 2,
            movie_name: 'name b' 
        } 
    ], 
    Count: 1, 
    ScannedCount: 2 
}
Run Code Online (Sandbox Code Playgroud)

  • @Ohsik,使用“包含”搜索永远不会是最佳选择,因为它始终需要对表进行完整扫描。如果您有大量数据,这可能会带来性能问题。但是,检查名称“begins with”是否可以与“query” API 一起使用并受益于索引,这将大大提高性能。但显然“开始于”与“包含”不同。 (3认同)
  • @Ohsik,如果您需要使用包含数百万行的“包含”,我建议您关注 [Elasticsearch](https://aws.amazon.com/elasticsearch-service/) 与 DynamoDB 的集成。 (3认同)
  • 您现在可以将其用作过滤表达式 (3认同)