Словарь ip_trie предназначен для поиска IP-адресов по сетевому префиксу.
Он хранит диапазоны IP в нотации CIDR и позволяет быстро определять, к какому префиксу (например, подсети или диапазону ASN) относится заданный IP-адрес, что делает его особенно удобным для IP-поиска, например для геолокации или классификации сетей.
Пример
Предположим, у нас есть таблица в ClickHouse, содержащая IP-префиксы и соответствующие им сопоставления:
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')
;
Определим словарь ip_trie для этой таблицы. Для структуры ip_trie требуется составной ключ:
DDL
Конфигурационный файл
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);
<structure>
<key>
<attribute>
<name>prefix</name>
<type>String</type>
</attribute>
</key>
<attribute>
<name>asn</name>
<type>UInt32</type>
<null_value />
</attribute>
<attribute>
<name>cca2</name>
<type>String</type>
<null_value>??</null_value>
</attribute>
...
</structure>
<layout>
<ip_trie>
<!-- Ключевой атрибут `prefix` можно получить с помощью dictGetString. -->
<!-- Эта опция увеличивает использование памяти. -->
<access_to_key_from_attributes>true</access_to_key_from_attributes>
</ip_trie>
</layout>
Ключ должен содержать только один атрибут типа String с допустимым IP-префиксом. Другие типы пока не поддерживаются.
Синтаксис:
dictGetT('dict_name', 'attr_name', ip)
Функция принимает либо значение типа UInt32 для IPv4, либо FixedString(16) для IPv6. Например:
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') │
└──────────────┘
Другие типы пока не поддерживаются. Функция возвращает атрибут для префикса, соответствующего этому IP-адресу. Если префиксы перекрываются, возвращается наиболее специфичный из них.
Данные должны полностью помещаться в оперативную память. Последнее изменение 10 июня 2026 г.