要件:S3に写真を保存していて、ユーザーがWebページに入力したキーワードを含むすべての写真を検索できるようにしたい。
私の解決策:2つのテーブルを作成しました: tblPhotos: Primary Key = HashKey:PhotoID Fields:PhotoID、S3Location
tblKeywords: Primary Key = HashKey(HashID)およびRangeKey(Keyword)フィールド:HashID(常に1に設定)、Keyword(1つの大きな文字列、キーワードの後にPhotoIDが続く)S3Location
次の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クエリを使用してこのレコードのフィルタリングを実現するためのより良い方法を知っていますか?スキャンは非常に非効率的であるため、回避しようとしていますが、上記のソリューションは機能しますが、特にエレガントではないようです。