2013-03-13 78 views
0

要求:我在S3中存储照片,并希望用户能够查找包含他们在网页上键入的关键字的所有照片。使用DynamoDB和PHP查询照片中的关键字

我的解决办法:我已创建2个表: tblPhotos: 主键= HashKey:PHOTOID 字段: PHOTOID, S3Loc​​ation

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查询实现记录过滤的更好方法?我试图避免扫描效率非常低,虽然我的解决方案虽然工作,但它似乎并不特别优雅!

回答

1

如果你的主要目标是能够返回所有的照片对于给定的关键词,我认为下面的模式会更有意义:

HashKey =关键字

RangeKey = PHOTOID

其他可能的字段:S3Name(如果它不是PhotoID相同)

+0

感谢您的答复,但我认为它只会让我有一个“行”每个主键?换句话说,每个关键字只有一个记录。我希望数以百计的photoID拥有相同的关键字。除非我错过了什么? – SRG 2013-03-13 23:38:34

+0

我应该调用密钥的第一部分“哈希”而不是“主”(上面编辑)......当你有一个“哈希和范围类型主键”时,第一个哈希值被假定为有重复。哈希和范围的组合是唯一的“主键”值... – Scrappydog 2013-03-14 20:10:28

+0

啊有趣的 - 我试过它的另一种方式,与PhotoID是哈希键和关键字是rangekey没有工作。 1 PhotoID可能有多个关键字,所以我需要测试一下,看看它是否可以应对。我会尽力让你知道,谢谢! – SRG 2013-03-14 20:16:30