如何在ClickHouse字典中查询包含指定IP的CIDR网段?
解决ClickHouse IP_TRIE字典的IP网段匹配问题
针对IP_TRIE布局的字典,不能使用普通的等值查询匹配包含目标IP的网段,需要利用ClickHouse为该布局提供的专属查询逻辑。
方法一:直接查询字典并传入IP参数
使用tuple()包装目标IP作为查询参数,ClickHouse会自动匹配包含该IP的最精确网段记录:
SELECT * FROM dictionary('reputation_rbl_db', tuple('1.10.15.55'))
方法二:使用dictGet系列函数获取指定字段
如果只需要部分字段,可以用dictGet逐个获取,适合嵌入复杂查询场景:
SELECT dictGet('reputation_rbl_db', 'network', tuple('1.10.15.55')) AS network, dictGet('reputation_rbl_db', 'source', tuple('1.10.15.55')) AS source, dictGet('reputation_rbl_db', 'category', tuple('1.10.15.55')) AS category, dictGet('reputation_rbl_db', 'asn', tuple('1.10.15.55')) AS asn, dictGet('reputation_rbl_db', 'country', tuple('1.10.15.55')) AS country
方法三:处理无匹配的情况(可选)
若担心目标IP没有对应网段记录,可使用dictGetOrDefault设置默认值:
SELECT dictGetOrDefault('reputation_rbl_db', 'network', tuple('1.10.15.55'), '') AS network, dictGetOrDefault('reputation_rbl_db', 'source', tuple('1.10.15.55'), '') AS source, dictGetOrDefault('reputation_rbl_db', 'category', tuple('1.10.15.55'), '') AS category, dictGetOrDefault('reputation_rbl_db', 'asn', tuple('1.10.15.55'), 0) AS asn, dictGetOrDefault('reputation_rbl_db', 'country', tuple('1.10.15.55'), '') AS country
原查询无效的原因
你之前使用的SELECT * FROM dictionary('reputation_rbl_db') where network = '1.10.15.55/32'是等值匹配网段字符串,但字典中不存在1.10.15.55/32这条记录,且IP_TRIE布局的字典不会自动解析该字符串为IP去匹配网段,因此无法得到结果。
内容的提问来源于stack exchange,提问作者maxid
相关产品推荐
相关产品推荐

