すべてのプロダクト
Search
ドキュメントセンター

Tablestore:IP データの型

最終更新日:Nov 09, 2025

多次元インデックスは IP データの型をサポートしています。この型は、ログ分析、ネットワークセキュリティ、ジオロケーションなどのシナリオで、IPv4 および IPv6 アドレスの効率的なストレージとクエリを提供します。

重要

多次元インデックスで IP データの型を使用するには、 に参加し、Tablestore のテクニカルサポートに連絡してこの機能を有効にしてください。

仕組み

IP データの型を使用するには、データテーブルの String フィールドを多次元インデックスの IP 型にマッピングします。IP データの型は、term クエリ、範囲クエリ、複合クエリの 3 つのクエリメソッドをサポートしています。特殊な IP アドレスインデックススキーマは、IPv4、IPv6、およびそれらの派生フォーマットの統一されたストレージと効率的な取得を提供します。

サポートされている IP フォーマット

IP データの型は、複数の IP アドレスフォーマットをサポートしています。次の表に、サポートされているフォーマットを示します。

IP アドレスフォーマット

説明

IPv4

IPv4 アドレスフォーマット。ピリオド (.) で区切られた 4 つの 10 進数のグループで構成されます。

127.0.0.1

192.168.1.1

IPv6

IPv6 アドレスフォーマット。コロン (:) で区切られた 4 つの 16 進数の 8 つのグループで構成されます。

FC00:0000:130F:0000:0000:09C0:876A:130B

短縮 IPv6 フォーマット

IPv6 アドレスの標準的な短縮表記をサポートします。

FFFF:192.168.1.1

IPv4射影IPv6アドレス

IPv4射影IPv6アドレスフォーマット。IPv4 フォーマットを使用したクエリをサポートします。

説明

たとえば、行の column_ip 列の値が ::FFFF:192.168.1.1 の場合、`column_ip = 192.168.1.1 ` を使用して term クエリを実行し、その行に一致させることができます。

::FFFF:192.168.1.1

クエリシナリオ

IP 型のクエリは、term クエリ (完全に一致)、範囲クエリ、複合クエリの 3 つのメソッドをサポートしています。各メソッドは、さまざまなビジネスシナリオに適しています。

クエリタイプ

説明

実装

適用シナリオ

Term クエリ

特定の IP アドレスに一致するデータをクエリします。

特定の IP アドレスで term クエリを使用します。

  • ログ分析シナリオ: ユーザーの動作追跡とエラー箇所特定。

  • ネットワークセキュリティシナリオ: ブラックリストとホワイトリストの検証、および身分認証の監査。

範囲クエリ

指定された IP アドレス範囲内のデータをクエリします。

  • (推奨) CIDR 表記で term クエリを使用します。

  • 範囲クエリを使用して IP アドレス範囲を指定します。

  • ジオロケーションシナリオ: IP ジオフェンシングとネットワークトポロジー分析。

  • リソースアクセス管理シナリオ: セキュリティ保護と CIDR サブネット管理。

複合クエリ

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 表記を使用することをお勧めします。このメソッドは、従来の範囲クエリよりも簡潔で正確であり、境界条件を設定する際のエラーを防ぐのに役立ちます。