Pular para o conteúdo principal
O dicionário ip_trie foi projetado para consultas de endereços IP por prefixo de rede. Ele armazena intervalos de IP em notação CIDR e permite determinar rapidamente em qual prefixo (por exemplo, uma sub-rede ou um intervalo de ASN) um determinado IP se encaixa, o que o torna ideal para pesquisas baseadas em IP, como geolocalização ou classificação de rede.
Exemplo Suponha que temos uma tabela no ClickHouse que contém nossos prefixos de IP e mapeamentos:
CREATE TABLE my_ip_addresses (
    prefix String,
    asn UInt32,
    cca2 String
)
ENGINE = MergeTree
PRIMARY KEY prefix;
INSERT INTO my_ip_addresses VALUES
    ('202.79.32.0/20', 17501, 'NP'),
    ('2620:0:870::/48', 3856, 'US'),
    ('2a02:6b8:1::/48', 13238, 'RU'),
    ('2001:db8::/32', 65536, 'ZZ')
;
Vamos definir um dicionário ip_trie para esta tabela. O layout ip_trie requer uma chave composta:
CREATE DICTIONARY my_ip_trie_dictionary (
    prefix String,
    asn UInt32,
    cca2 String DEFAULT '??'
)
PRIMARY KEY prefix
SOURCE(CLICKHOUSE(TABLE 'my_ip_addresses'))
LAYOUT(IP_TRIE)
LIFETIME(3600);

A chave deve ter apenas um atributo do tipo String que contenha um prefixo de IP válido. Outros tipos ainda não são compatíveis. A sintaxe é:
dictGetT('dict_name', 'attr_name', ip)
A função aceita UInt32 para IPv4 ou FixedString(16) para IPv6. Por exemplo:
SELECT dictGet('my_ip_trie_dictionary', 'cca2', toIPv4('202.79.32.10')) AS result;

┌─result─┐
│ NP     │
└────────┘

SELECT dictGet('my_ip_trie_dictionary', 'asn', IPv6StringToNum('2001:db8::1')) AS result;

┌─result─┐
65536
└────────┘

SELECT dictGet('my_ip_trie_dictionary', ('asn', 'cca2'), IPv6StringToNum('2001:db8::1')) AS result;

┌─result───────┐
│ (65536,'ZZ') │
└──────────────┘
Outros tipos ainda não são suportados. A função retorna o atributo do prefixo correspondente a este endereço IP. Se houver prefixos sobrepostos, será retornado o mais específico. Os dados devem caber inteiramente na RAM.
Última modificação em 10 de junho de 2026