Saltar al contenido principal
El diccionario ip_trie está diseñado para búsquedas de direcciones IP por prefijo de red. Almacena rangos de IP en notación CIDR y permite determinar rápidamente en qué prefijo (p. ej., subred o rango de ASN) se encuentra una IP dada, lo que lo hace ideal para búsquedas basadas en IP, como la geolocalización o la clasificación de redes.
Ejemplo Supongamos que tenemos una tabla en ClickHouse que contiene nuestros prefijos de IP y sus asignaciones:
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')
;
Definamos un diccionario ip_trie para esta tabla. El layout ip_trie requiere una clave compuesta:
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);

La clave debe tener un único atributo de tipo String que contenga un prefijo IP válido. Otros tipos todavía no son compatibles. La sintaxis es:
dictGetT('dict_name', 'attr_name', ip)
La función recibe UInt32 para IPv4 o FixedString(16) para IPv6. Por ejemplo:
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') │
└──────────────┘
Otros tipos todavía no son compatibles. La función devuelve el atributo del prefijo correspondiente a esta dirección IP. Si hay prefijos superpuestos, se devuelve el más específico. Los datos deben caber por completo en la RAM.
Última modificación el 10 de junio de 2026