Перейти к основному содержимому
Перейти к основному содержимому

Тип размещения словаря ip_trie

Словарь 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 требует составного ключа:

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);

Ключ может иметь только один атрибут типа 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-адресу. Если есть перекрывающиеся префиксы, возвращается наиболее точный.

Данные должны полностью помещаться в оперативную память.