多次元インデックスは IP データの型をサポートしています。この型は、ログ分析、ネットワークセキュリティ、ジオロケーションなどのシナリオで、IPv4 および IPv6 アドレスの効率的なストレージとクエリを提供します。
多次元インデックスで IP データの型を使用するには、 に参加し、Tablestore のテクニカルサポートに連絡してこの機能を有効にしてください。
仕組み
IP データの型を使用するには、データテーブルの String フィールドを多次元インデックスの IP 型にマッピングします。IP データの型は、term クエリ、範囲クエリ、複合クエリの 3 つのクエリメソッドをサポートしています。特殊な IP アドレスインデックススキーマは、IPv4、IPv6、およびそれらの派生フォーマットの統一されたストレージと効率的な取得を提供します。
サポートされている IP フォーマット
IP データの型は、複数の IP アドレスフォーマットをサポートしています。次の表に、サポートされているフォーマットを示します。
IP アドレスフォーマット | 説明 | |
IPv4 | IPv4 アドレスフォーマット。ピリオド (.) で区切られた 4 つの 10 進数のグループで構成されます。 |
|
IPv6 | IPv6 アドレスフォーマット。コロン (:) で区切られた 4 つの 16 進数の 8 つのグループで構成されます。 |
|
短縮 IPv6 フォーマット | IPv6 アドレスの標準的な短縮表記をサポートします。 |
|
IPv4射影IPv6アドレス | IPv4射影IPv6アドレスフォーマット。IPv4 フォーマットを使用したクエリをサポートします。 説明 たとえば、行の column_ip 列の値が |
|
クエリシナリオ
IP 型のクエリは、term クエリ (完全に一致)、範囲クエリ、複合クエリの 3 つのメソッドをサポートしています。各メソッドは、さまざまなビジネスシナリオに適しています。
クエリタイプ | 説明 | 実装 | 適用シナリオ |
Term クエリ | 特定の IP アドレスに一致するデータをクエリします。 | 特定の IP アドレスで term クエリを使用します。 |
|
範囲クエリ | 指定された IP アドレス範囲内のデータをクエリします。 |
|
|
複合クエリ | IP アドレスと他のディメンションの組み合わせに基づいてデータをクエリします。 | 複合クエリ機能を使用します。 |
|
IP 型フィールドの使用
IP 型フィールドは、Tablestore Java SDK および Go SDK で使用できます。このトピックでは、Java SDK を例として使用します。Tablestore Java SDK は、バージョン 5.17.6 以降を使用する必要があります。
ステップ 1: IP 型を含む多次元インデックスの作成
多次元インデックスを作成するときに、IP クエリに使用する String フィールドを IP 型にマッピングします。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(TABLE_NAME);
request.setIndexName(INDEX_NAME);
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("Col_Keyword", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
// Col_Ip 列のインデックスを IP 型に設定します。
new FieldSchema("Col_Ip", FieldType.IP).setIndex(true).setEnableSortAndAgg(true)
));
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);
}ステップ 2: データテーブルへの IP データの書き込み
IP 型として構成したフィールドに IP アドレスデータを書き込みます。
private static void putRow(SyncClient client) {
String[] keywords = { "Router", "Phone", "PC1", "PC2", "Home Bot" };
for (int i = 0; i < 5; i++) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("pk1" + i));
PrimaryKey primaryKey = primaryKeyBuilder.build();
RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey);
// 属性列を追加します。
rowPutChange.addColumn("Col_Keyword", ColumnValue.fromString(keywords[i]));
// 属性列を追加し、IP アドレスを書き込みます。
rowPutChange.addColumn("Col_Ip", ColumnValue.fromString("192.168.1." + i));
client.putRow(new PutRowRequest(rowPutChange));
}
}ステップ 3: 構成の確認
term IP クエリの確認
/** * 特定の IP アドレスをクエリするには、TermQuery を使用します。 */ private static void searchExactIp(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); TermQuery query = QueryBuilders.term("Col_Ip", "192.168.1.1").build(); searchQuery.setQuery(query); searchQuery.setLimit(100); SearchRequest searchRequest = new SearchRequest(TABLE_NAME, INDEX_NAME, searchQuery); SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); columnsToGet.setReturnAll(true); searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); System.out.println("TotalCount: " + resp.getTotalCount()); System.out.println("Row: " + resp.getRows()); }IP 範囲クエリの確認
/** * IP アドレス範囲をクエリするには、TermQuery で CIDR 表記を使用するか、RangeQuery を使用します。 */ private static void searchIpSegment(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); // CIDR 表記を使用して IP 範囲をクエリします。 TermQuery query = QueryBuilders.term("Col_Ip", "192.168.1.1/24").build(); // または、RangeQuery を使用して IP 範囲をクエリします。 // RangeQuery query = QueryBuilders.range("Col_Ip").greaterThanOrEqual("192.168.1.0").lessThanOrEqual("192.168.1.255").build(); searchQuery.setQuery(query); searchQuery.setLimit(100); SearchRequest searchRequest = new SearchRequest(TABLE_NAME, INDEX_NAME, searchQuery); SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); columnsToGet.setReturnAll(true); searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); System.out.println("TotalCount: " + resp.getTotalCount()); System.out.println("Row: " + resp.getRows()); }
本番での使用
範囲クエリの推奨事項
範囲クエリを実行するときは、IP アドレス範囲の上限と下限の両方の境界を指定することをお勧めします。データテーブルに IPv4 と IPv6 の両方のアドレスが含まれている場合、IPv4 アドレスの単一の境界条件のみでクエリを実行すると、不要な IPv6 アドレスが返される可能性があります。
CIDR 表記の推奨事項
IP 範囲クエリには、
192.168.1.1/24などの CIDR 表記を使用することをお勧めします。このメソッドは、従来の範囲クエリよりも簡潔で正確であり、境界条件を設定する際のエラーを防ぐのに役立ちます。