4

Ich versuche, Suchfunktion auf meiner React App zu machen.So machen Sie Suche mit "enthält" mit DynamoDB

Ich habe diese DynamoDB Tabelle:

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

Ich möchte eine Suchfunktion, um zu suchen, „b“ auf der Sucheingabe des Reagieren App und „name b“ von der DB als Ergebnis erhalten.

Ich habe versucht, query mit CONTAINS, aber hat nicht funktioniert und scheint nicht ein geeigneter Weg, es zu tun.

Was ist der beste Weg, um Suchfunktion in meiner React App mit DynamoDB zu erstellen?

Ist es sogar sinnvoll, eine Abfrage mit dem Suchschlüsselwort auszuführen, um zu prüfen, ob die Daten einen Schlüsselwortwert enthalten?

Antwort

3

Der Operator CONTAINS ist in der API query nicht verfügbar. Sie müssen hierzu die API scan verwenden (see this link).

Versuchen Sie Folgendes:

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); 
}); 

Ergebnis:

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

Sie so viel Dank! Es klappt! Eine weitere Frage tho, ist dieser ideale Weg, um Suchfunktion zu bauen? oder gibt es einen besseren Weg, dies zu tun? – Ohsik

+0

@Ohsik, Suche mit "enthält" wird nie optimal sein, da es immer einen vollständigen Scan der Tabelle erfordert. Dies kann zu Leistungsproblemen führen, wenn Sie viele Daten haben. Die Überprüfung, ob der Name "beginnt mit" ist, kann jedoch mit der API "query" verwendet werden und von Indizes profitieren, wodurch die Leistung erheblich verbessert wird. Aber offensichtlich "beginnt mit" ist anders als "enthält". – Zanon

+0

@Ohsik, wenn Sie "contains" mit Millionen von Zeilen verwenden müssen, schlage ich vor, dass Sie nach [Elasticsearch] (https://aws.amazon.com/elasticsearch-service/) Integration mit DynamoDB suchen. – Zanon