多元索引新增IP類型資料類型,支援對IPv4和IPv6地址進行高效儲存和查詢,滿足日誌分析、網路安全、地區定位等情境的IP地址檢索需求。
如需使用多元索引IP類型,請聯絡Table Store支援人員開通。
工作原理
通過將資料表中的String類型欄位對應到多元索引的IP類型即可使用IP類型。IP類型支援精確查詢、範圍查詢和混合查詢三種查詢方式。通過專門的IP地址索引結構,實現對IPv4、IPv6地址及其變體格式的統一儲存和高效檢索。
IP格式支援
IP類型支援多種IP地址格式,具體格式說明請參見下表。
IP地址格式 | 描述 | |
IPv4 | IPv4格式的IP地址,分為4組十進位數,每組之間通過半形句號(.)分隔。 |
|
IPv6 | IPv6格式的IP地址,分為8組四位十六進位數,每組之間通過半形冒號(:)分隔。 |
|
IPv6縮寫格式 | 支援IPv6地址的標準縮寫標記法。 |
|
IPv4映射的IPv6地址 | IPv4-Mapped IPv6 Address格式,支援以IPv4格式查詢。 說明 例如寫入時某行的column_ip列值為 |
|
查詢情境
IP類型查詢支援精確查詢(即等值查詢)、範圍查詢和混合查詢三種方式,適用於不同的業務情境。
查詢類型 | 說明 | 實現方式 | 應用情境 |
精確查詢 | 查詢匹配指定IP地址的資料。 | 使用精確查詢時配置具體IP地址 |
|
範圍查詢 | 查詢在指定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),相比傳統的範圍查詢方式更加簡潔準確,避免邊界條件設定錯誤。