O tipo de dados IP em índices de busca armazena e consulta endereços IPv4 e IPv6 para cenários de análise de logs, segurança de rede e geolocalização.
Para usar o tipo de dados IP em um índice de busca, e entre em contato com o suporte técnico do Tablestore para ativar o recurso.
Como funciona
Mapeie um campo String da tabela de dados para o tipo IP no índice de busca. O tipo de dados IP oferece três métodos de consulta: consulta de termo, consulta de intervalo e consulta composta. Uma estrutura de índice especializada para endereços IP fornece armazenamento unificado e recuperação eficiente para IPv4, IPv6 e seus formatos variantes.
Formatos de IP compatíveis
O tipo de dados IP aceita os seguintes formatos de endereço IP.
|
Formato de endereço IP |
Descrição |
|
|
IPv4 |
Formato padrão de endereço IPv4: quatro grupos de números decimais separados por pontos (.). |
|
|
IPv6 |
Formato padrão de endereço IPv6: oito grupos de quatro dígitos hexadecimais separados por dois pontos (:). |
|
|
Formato IPv6 abreviado |
Notação abreviada padrão para endereços IPv6. |
|
|
Endereço IPv6 mapeado para IPv4 |
Formato de endereço IPv6 mapeado para IPv4. Permite consultas usando o formato IPv4. Nota
Por exemplo, se o valor da coluna |
|
Cenários de consulta
As consultas do tipo IP oferecem três métodos, cada um adequado para diferentes cenários de negócios.
|
Tipo de consulta |
Descrição |
Implementação |
Caso de uso |
|
Consulta de termo |
Corresponde a um endereço IP específico. |
Especifique o endereço IP de destino em uma consulta de termo. |
|
|
Consulta de intervalo |
Corresponde a dados dentro de um intervalo de endereços IP especificado. |
|
|
|
Consulta composta |
Combina condições de endereço IP com outras dimensões. |
Use o recurso de consulta composta para combinar múltiplas condições. |
|
Usar um campo do tipo IP
Os SDKs Java e Go do Tablestore aceitam campos do tipo IP. O exemplo a seguir usa o SDK para Java. Use a versão 5.17.6 ou posterior do SDK Java do Tablestore.
Etapa 1: Crie um índice de busca que contenha um tipo IP
Ao criar um índice de busca, mapeie o campo String destinado a consultas de IP para o tipo 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),
// Set the index for the Col_Ip column to the IP type.
new FieldSchema("Col_Ip", FieldType.IP).setIndex(true).setEnableSortAndAgg(true)
));
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);
}
Etapa 2: Gravar dados de IP na tabela de dados
Grave dados de endereço IP no campo configurado como tipo IP.
private static void putRow(SyncClient client) {
String[] keywords = { "Router", "Phone", "PC1", "PC2", "Home Bot" };
for (int i = 0; i < 5; i++) {
// Build the primary key.
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);
// Add an attribute column.
rowPutChange.addColumn("Col_Keyword", ColumnValue.fromString(keywords[i]));
// Add an attribute column and write the IP address.
rowPutChange.addColumn("Col_Ip", ColumnValue.fromString("192.168.1." + i));
client.putRow(new PutRowRequest(rowPutChange));
}
}
Etapa 3: Verifique a configuração
-
Verifique uma consulta de termo de IP
/** * To query for an exact IP address, use 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()); } -
Verifique uma consulta de intervalo de IP
/** * To query for an IP address range, you can use CIDR notation in a TermQuery or use a RangeQuery. */ private static void searchIpSegment(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); // Query for an IP range using CIDR notation. TermQuery query = QueryBuilders.term("Col_Ip", "192.168.1.1/24").build(); // Alternatively, use a RangeQuery to query for an IP range. // 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()); }
Melhores práticas
-
Especifique ambos os limites nas consultas de intervalo
Sempre especifique os limites superior e inferior do intervalo de endereços IP. Se a tabela de dados contiver endereços IPv4 e IPv6, uma consulta com apenas uma condição de limite para um endereço IPv4 poderá retornar endereços IPv6 indesejados.
-
Prefira a notação CIDR
Para consultas de intervalo de IP, use a notação CIDR, como
192.168.1.1/24. A notação CIDR é mais concisa e precisa do que as consultas de intervalo tradicionais, ajudando a prevenir erros de condição de limite.