次の Tablestore SDK を使用して、検索インデックスの作成時にルーティングフィールドを指定できます。Tablestore SDK for Java、Tablestore SDK for Go、Tablestore SDK for Python、Tablestore SDK for Node.js、Tablestore SDK for .NET、Tablestore SDK for PHP。この例では、Tablestore SDK for Java を使用して、ルーティングフィールドを指定および使用する方法について説明します。
次のサンプルコードは、order という名前のデータテーブルを作成し、検索インデックスを作成するときにルーティングフィールドを user_id フィールドに設定し、データテーブルにデータを書き込み、クエリリクエストでルーティングフィールドを指定する方法の例を示しています。この例では、データテーブルには STRING 型の order_id 列と STRING 型の user_id 列が含まれています。検索インデックスには、KEYWORD 型の product_name フィールド、LONG 型の order_time フィールド、および KEYWORD 型の user_id フィールドが含まれています。
private static void testRoute(SyncClient client) throws InterruptedException {
// テーブルを作成します。
TableMeta meta = new TableMeta("order");
meta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING);
meta.addPrimaryKeyColumn("user_id",PrimaryKeyType.STRING);
TableOptions options = new TableOptions();
options.setMaxVersions(1);
options.setTimeToLive(-1);
CreateTableRequest request = new CreateTableRequest(meta,options);
request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0)));
CreateTableResponse response = client.createTable(request);
// 検索インデックスを作成し、ルーティングフィールドを指定します。
CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
searchIndexRequest.setTableName("order");
// データテーブルに作成される検索インデックスの名前を指定します。
searchIndexRequest.setIndexName("order_index");
IndexSchema indexSchema = new IndexSchema();
IndexSetting indexSetting = new IndexSetting();
// ルーティングフィールドを user_id フィールドに設定します。
indexSetting.setRoutingFields(Arrays.asList("user_id"));
indexSchema.setIndexSetting(indexSetting);
// インデックスフィールドを追加します。次のインデックスフィールドは参考のためにのみ追加されています。ビジネス要件に基づいてインデックスフィールドを追加できます。
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("product_name",FieldType.KEYWORD).setStore(true).setIndex(true),
new FieldSchema("order_time",FieldType.LONG).setStore(true).setEnableSortAndAgg(true).setIndex(true),
new FieldSchema("user_id",FieldType.KEYWORD).setStore(true).setIndex(true)
));
searchIndexRequest.setIndexSchema(indexSchema);
client.createSearchIndex(searchIndexRequest);
// データテーブルがロードされるまで待機します。
Thread.sleep(6*1000);
// テスト用のデータを挿入します。
String[] productName = new String[]{"product a", "product b", "product c"};
String[] userId = new String[]{"00001", "00002", "00003", "00004", "00005"};
for (int i = 0; i < 100; i++){
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString(i+""));
primaryKeyBuilder.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString(userId[i%(userId.length)]));
PrimaryKey primaryKey = primaryKeyBuilder.build();
RowPutChange rowPutChange = new RowPutChange("order",primaryKey);
// 属性列にデータを書き込みます。
rowPutChange.addColumn("product_name",ColumnValue.fromString(productName[i%(productName.length)]));
rowPutChange.addColumn("order_time",ColumnValue.fromLong(System.currentTimeMillis()));
rowPutChange.setCondition(new Condition(RowExistenceExpectation.IGNORE));
client.putRow(new PutRowRequest(rowPutChange));
}
// データが検索インデックスに同期されるまで待機します。
Thread.sleep(20*1000);
// クエリリクエストでルーティングフィールドを指定します。
SearchRequest searchRequest = new SearchRequest();
searchRequest.setTableName("order");
searchRequest.setIndexName("order_index");
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("user_id");
matchQuery.setText("00002");
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
searchQuery.setGetTotalCount(true);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
searchRequest.setColumnsToGet(columnsToGet);
searchRequest.setSearchQuery(searchQuery);
PrimaryKeyBuilder pkbuild = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkbuild.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString("00002"));
PrimaryKey routingValue = pkbuild.build();
searchRequest.setRoutingValues(Arrays.asList(routingValue));
SearchResponse searchResponse = client.search(searchRequest);
System.out.println(searchResponse.isAllSuccess());
System.out.println("totalCount:"+ searchResponse.getTotalCount());
System.out.println("RowCount:"+searchResponse.getRows().size());
}