0
要求:我在S3中存储照片,并希望用户能够查找包含他们在网页上键入的关键字的所有照片。使用DynamoDB和PHP查询照片中的关键字
我的解决办法:我已创建2个表: tblPhotos: 主键= HashKey:PHOTOID 字段: PHOTOID, S3Location
tblKeywords: 主键= HashKey(HashID)和RangeKey(关键字) Fields: HashID(始终设置为1), 关键字(一个大字符串;关键字后跟PhotoID) S3位置
我用下面的PHP代码,发现有我的关键字中的所有记录:
$table_name = 'tblKeywords';
$keywordresponse = $dynamodb->query(array(
'TableName' => $table_name,
'HashKeyValue' => array(AmazonDynamoDB::TYPE_STRING => '1'),
'RangeKeyCondition' => array(
'ComparisonOperator' => AmazonDynamoDB::CONDITION_BEGINS_WITH,
'AttributeValueList' => array(
array(AmazonDynamoDB::TYPE_STRING => $_GET['sSearch'])
),
)
));
if ($keywordresponse->isOK())
{
foreach ($keywordresponse->body->Items as $item)
{
$aaData[] = array(
'Keyword' => (string) $item->Keyword->{AmazonDynamoDB::TYPE_STRING},
'S3Location' => (string) $item->S3Location->{AmazonDynamoDB::TYPE_STRING}
);
}
echo json_encode(array('keywordstatus' => 1, 'aaData' => $aaData));
}
else
{
echo json_encode(array('keywordstatus' => 0));
}
正如你可以看到我传递SSEARCH作为对搜索结果进行过滤的关键字。我的问题是,您是否知道使用DynamoDB查询实现记录过滤的更好方法?我试图避免扫描效率非常低,虽然我的解决方案虽然工作,但它似乎并不特别优雅!
感谢您的答复,但我认为它只会让我有一个“行”每个主键?换句话说,每个关键字只有一个记录。我希望数以百计的photoID拥有相同的关键字。除非我错过了什么? – SRG 2013-03-13 23:38:34
我应该调用密钥的第一部分“哈希”而不是“主”(上面编辑)......当你有一个“哈希和范围类型主键”时,第一个哈希值被假定为有重复。哈希和范围的组合是唯一的“主键”值... – Scrappydog 2013-03-14 20:10:28
啊有趣的 - 我试过它的另一种方式,与PhotoID是哈希键和关键字是rangekey没有工作。 1 PhotoID可能有多个关键字,所以我需要测试一下,看看它是否可以应对。我会尽力让你知道,谢谢! – SRG 2013-03-14 20:16:30