处理本地二级索引:Java
您可以使用 AWS SDK for Java 文档 API 创建具有一个或多个本地二级索引的 Amazon DynamoDB 表、描述表中的索引,以及使用索引执行查询。
下面是使用 AWS SDK for Java 文档 API 执行表操作的常见步骤。
-
创建
DynamoDB
类的实例。 -
通过创建对应的请求对象,为操作提供必需参数和可选参数。
-
调用您在前面步骤中创建的客户端提供的适当方法。
创建具有本地二级索引的表
本地二级索引必须在您创建表的同时创建。为此,请使用 createTable
方法并为一个或多个本地二级索引提供您的规范。以下 Java 代码示例创建一个包含音乐精选中歌曲信息的表。分区键为 Artist
,排序键为 SongTitle
。AlbumTitleIndex
这一二级索引可以按专辑名称进行查询。
下面是使用 DynamoDB 文档 API 创建具有本地二级索引的表的步骤。
-
创建
DynamoDB
类的实例。 -
创建
CreateTableRequest
类实例,以提供请求信息。您必须提供表名称、主键以及预配置吞吐量值。对于本地二级索引,您必须提供索引名称、索引排序键的名称和数据类型、索引的键架构以及属性投影。
-
以参数形式提供请求对象,以调用
createTable
方法。
以下 Java 代码示例演示了上述步骤。该代码创建表 (Music
),在 AlbumTitle
属性上具有二级索引。投影到索引的属性只有表的分区键、排序键以及索引排序键。
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName); //ProvisionedThroughput createTableRequest.setProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits((long)5).withWriteCapacityUnits((long)5)); //AttributeDefinitions ArrayList<AttributeDefinition> attributeDefinitions= new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition().withAttributeName("Artist").withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition().withAttributeName("SongTitle").withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition().withAttributeName("AlbumTitle").withAttributeType("S")); createTableRequest.setAttributeDefinitions(attributeDefinitions); //KeySchema ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>(); tableKeySchema.add(new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition key tableKeySchema.add(new KeySchemaElement().withAttributeName("SongTitle").withKeyType(KeyType.RANGE)); //Sort key createTableRequest.setKeySchema(tableKeySchema); ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>(); indexKeySchema.add(new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition key indexKeySchema.add(new KeySchemaElement().withAttributeName("AlbumTitle").withKeyType(KeyType.RANGE)); //Sort key Projection projection = new Projection().withProjectionType(ProjectionType.INCLUDE); ArrayList<String> nonKeyAttributes = new ArrayList<String>(); nonKeyAttributes.add("Genre"); nonKeyAttributes.add("Year"); projection.setNonKeyAttributes(nonKeyAttributes); LocalSecondaryIndex localSecondaryIndex = new LocalSecondaryIndex() .withIndexName("AlbumTitleIndex").withKeySchema(indexKeySchema).withProjection(projection); ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new ArrayList<LocalSecondaryIndex>(); localSecondaryIndexes.add(localSecondaryIndex); createTableRequest.setLocalSecondaryIndexes(localSecondaryIndexes); Table table = dynamoDB.createTable(createTableRequest); System.out.println(table.getDescription());
您必须等待 DynamoDB 创建该表并将表的状态设置为 ACTIVE
。然后,您就可以开始在表中添加数据项目。
描述具有本地二级索引的表
要获取表上有关本地二级索引的信息,请使用 describeTable
方法。对于每个索引,您都可以查看其名称、键架构和投影的属性。
以下是使用 AWS SDK for Java 文档 API 访问表的本地二级索引信息的步骤。
-
创建
DynamoDB
类的实例。 -
创建
Table
类的实例。您必须提供表名称。 -
调用
describeTable
对象上的Table
方法。
以下 Java 代码示例演示了上述步骤。
例
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; Table table = dynamoDB.getTable(tableName); TableDescription tableDescription = table.describe(); List<LocalSecondaryIndexDescription> localSecondaryIndexes = tableDescription.getLocalSecondaryIndexes(); // This code snippet will work for multiple indexes, even though // there is only one index in this example. Iterator<LocalSecondaryIndexDescription> lsiIter = localSecondaryIndexes.iterator(); while (lsiIter.hasNext()) { LocalSecondaryIndexDescription lsiDescription = lsiIter.next(); System.out.println("Info for index " + lsiDescription.getIndexName() + ":"); Iterator<KeySchemaElement> kseIter = lsiDescription.getKeySchema().iterator(); while (kseIter.hasNext()) { KeySchemaElement kse = kseIter.next(); System.out.printf("\t%s: %s\n", kse.getAttributeName(), kse.getKeyType()); } Projection projection = lsiDescription.getProjection(); System.out.println("\tThe projection type is: " + projection.getProjectionType()); if (projection.getProjectionType().toString().equals("INCLUDE")) { System.out.println("\t\tThe non-key projected attributes are: " + projection.getNonKeyAttributes()); } }
查询本地二级索引
您可以对本地二级索引使用 Query
操作,基本与对表执行 Query
操作一样。您需要指定索引名称、索引排序键的查询条件以及要返回的属性。在本示例中,索引为 AlbumTitleIndex
,索引排序键为 AlbumTitle
。
要返回的只包含投影到索引的属性。您也可以修改此查询,让返回结果中也包含非键属性,但是这样会导致表抓取活动的成本相对较高的。有关表获取的更多信息,请参阅 属性投影。
以下是使用 AWS SDK for Java 文档 API 查询本地二级索引的步骤。
-
创建
DynamoDB
类的实例。 -
创建
Table
类的实例。您必须提供表名称。 -
创建
Index
类的实例。您必须提供索引名称。 -
调用
query
类的Index
方法。
以下 Java 代码示例演示了上述步骤。
例
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; Table table = dynamoDB.getTable(tableName); Index index = table.getIndex("AlbumTitleIndex"); QuerySpec spec = new QuerySpec() .withKeyConditionExpression("Artist = :v_artist and AlbumTitle = :v_title") .withValueMap(new ValueMap() .withString(":v_artist", "Acme Band") .withString(":v_title", "Songs About Life")); ItemCollection<QueryOutcome> items = index.query(spec); Iterator<Item> itemsIter = items.iterator(); while (itemsIter.hasNext()) { Item item = itemsIter.next(); System.out.println(item.toJSONPretty()); }