全部產品
Search
文件中心

Tablestore:IP類型

更新時間:Oct 31, 2025

多元索引新增IP類型資料類型,支援對IPv4和IPv6地址進行高效儲存和查詢,滿足日誌分析、網路安全、地區定位等情境的IP地址檢索需求。

重要

如需使用多元索引IP類型,請聯絡Table Store支援人員開通。

工作原理

通過將資料表中的String類型欄位對應到多元索引的IP類型即可使用IP類型。IP類型支援精確查詢、範圍查詢和混合查詢三種查詢方式。通過專門的IP地址索引結構,實現對IPv4、IPv6地址及其變體格式的統一儲存和高效檢索。

IP格式支援

IP類型支援多種IP地址格式,具體格式說明請參見下表。

IP地址格式

描述

IPv4

IPv4格式的IP地址,分為4組十進位數,每組之間通過半形句號(.)分隔。

127.0.0.1

192.168.1.1

IPv6

IPv6格式的IP地址,分為8組四位十六進位數,每組之間通過半形冒號(:)分隔。

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

IPv6縮寫格式

支援IPv6地址的標準縮寫標記法。

FFFF:192.168.1.1

IPv4映射的IPv6地址

IPv4-Mapped IPv6 Address格式,支援以IPv4格式查詢。

說明

例如寫入時某行的column_ip列值為::FFFF:192.168.1.1,在使用 column_ip = 192.168.1.1 進行精確查詢可匹配到該行。

::FFFF:192.168.1.1

查詢情境

IP類型查詢支援精確查詢(即等值查詢)、範圍查詢和混合查詢三種方式,適用於不同的業務情境。

查詢類型

說明

實現方式

應用情境

精確查詢

查詢匹配指定IP地址的資料。

使用精確查詢時配置具體IP地址

  • 日誌分析情境:使用者行為跟蹤、故障定位

  • 網路安全情境:黑白名單驗證、身份認證審計

範圍查詢

查詢在指定IP範圍內的資料。

  • (推薦)使用精確查詢時配置CIDR

  • 使用範圍查詢時指定IP位址範圍

  • 地區定位情境:IP地理柵欄、網路拓撲分析

  • 存取控制情境:安全防護、CIDR子網管理

混合查詢

基於IP地址與其他維度組合查詢資料。

使用組合查詢功能

  • 多維聯集查詢:基於IP地址進行時間維度或使用者行為查詢

使用IP類型欄位

目前支援通過Table StoreJava SDK和Go SDK使用IP類型欄位。此處以Java SDK為例介紹,請使用5.17.6及以上版本的Table StoreJava SDK。

步驟一:建立包含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);
}

步驟二:寫入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));
    }
}

步驟三:驗證配置效果

  • 驗證精確IP查詢

    /**
     * 精確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();
        // 或者使用Range查詢來查詢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位址範圍,建議同時指定IP地址的上邊界與下邊界。當資料表中IPv4地址和IPv6地址混合儲存時,如果查詢時僅指定單個邊界條件且要查詢IPv4地址,則可能會查詢到IPv6地址。

  • CIDR標記法推薦

    對於IP範圍查詢,推薦使用CIDR標記法(如192.168.1.1/24),相比傳統的範圍查詢方式更加簡潔準確,避免邊界條件設定錯誤。