我有一个名为Users的DynamoDb表。我正在尝试执行一个非常简单的查询,其中用户的姓氏类似于'John*‘(Johnson,Johnston,Johnny等),但是我找不到一个非常直接的示例。
下面是我的代码片段:
public class DynamoDbUsersTest extends ApplicationTest {
@Autowired
private DynamoDb dynamoDb;
private Table usersTable = dynamoDb.getTable("Users");
public void getUsersByLastNameContainsTest(){
//userTable.contains(user.getLastName()); // No such method.
userTable.scan(new ScanFilter("lastName").contains("John");
...
}
}有人能给我指个方向吗?我尝试查看Query对象,但我不确定它是否能完成我所需的工作。
我不得不使用Scan对象来完成这项工作,但是它会对每个查询执行全表扫描。有没有人找到一种更好/更快的搜索部分值的方法?下面的代码会更快吗?
public class DynamoDbUsersTest extends ApplicationTest {
@Autowired
private DynamoDb dynamoDb;
private Table usersTable = dynamoDb.getTable("Users");
public void getUsersByLastNameContainsTest(){
userTable.query(new QueryFilter("lastName").contains("John");
...
}
}发布于 2017-03-08 11:00:44
子字符串匹配是ElasticSearch做得很好的一件事。我建议您打开您的DynamoDB表的流,并在AWS ElasticSearch集群中索引您的项目/文档。
发布于 2017-03-08 06:55:59
下面是使用contains部分匹配字符串的ScanSpec。
Table table = dynamoDB.getTable("tablename");
Map<String, Object> attributeValueMap = new HashMap<>();
attributeValueMap.put(":lastNameValue", "John");
ScanSpec scanSpec = new ScanSpec().withFilterExpression("contains (lastName,:lastNameValue)")
.withValueMap(attributeValueMap);
IteratorSupport<Item, ScanOutcome> scanOutcome = null;
scanOutcome = table.scan(scanSpec).iterator();
while (scanOutcome.hasNext()) {
System.out.println("Output ==============>" + scanOutcome.next().toJSON());
}编辑:-
正如在其他答案中提到的,如果您知道散列键,并且lastname未定义为散列键,则可以使用QuerySpec。此外,您只能在FilterExpression上使用contains。换句话说,它不能在KeyConditionExpression上使用。
QuerySpec需要KeyConditionExpression,它只支持哈希键属性上的相等运算符。然后在FilterExpression上,您可以对非键属性使用contains。
发布于 2017-03-08 11:45:06
您不能将contains用作查询的一部分,而只能用作扫描;但是如果您只关心以特定值开头的结果,则可以使用begins_with查询操作符:begins_with (a, substr) (其中a是您的键名)。为此,键必须是排序键,而不是分区键。请参阅http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query和http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html
https://stackoverflow.com/questions/42656061
复制相似问题