ClickHouse位图函数的用法

本文介绍了位图函数的概念、构造方法及使用方法。包括如何构造位图、位图转数组、位图属性查询、位图切片操作及各种位图运算如与、或、异或等。适用于需要高效处理集合运算的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、位图函数的概念

位图函数用于对两个位图对象进行计算,对于任何一个位图函数,计算结果都将返回一个位图对象。

二、位图对象的构造方法

位图对象有两种构造方法。其一是由聚合函数groupBitmapState构造的,其二是由Array Object构造的。同时还可以将位图对象转化为数组对象。

三、位图函数的用法

在这里插入图片描述

(一)构造位图

bitmapBuild

从无符号整数数组构建位图对象

bitmapBuild(array)
注:array – 无符号整数数组

select bitmapBuild([1, 2, 3, 4, 5]) as result

(二)位图对象转化为数组对象

bitmapToArray

将位图转换为整数数组

bitmapToArray(bitmap)
注:bitmap – 位图对象

select bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) as result

(三)位图对象的属性

1.bitmapContains

检查位图是否包含指定元素

bitmapContains(haystack, needle)
注:
haystack – 位图对象
needle – 元素,类型UInt32

select bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) as result
2.bitmapCardinality

返回一个UInt64类型的数值,表示位图对象的基数

bitmapCardinality(bitmap)
注:bitmap – 位图对象

select bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) as result
3.bitmapMin

返回一个UInt64类型的数值,表示位图中的最小值。如果位图为空则返回UINT32_MAX

bitmapMin(bitmap)
注:bitmap – 位图对象

select bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) as result
4.bitmapMax

返回一个UInt64类型的数值,表示位图中的最大值。如果位图为空则返回0

bitmapMax(bitmap)
注:bitmap – 位图对象

select bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) as result

(四)位图转换为新位图

1.bitmapSubsetInRange

将位图指定范围(不包含range_end)转换为另一个位图

bitmapSubsetInRange(bitmap, range_start, range_end)
注:
bitmap – 位图对象
range_start – 范围起始点(含)
range_end – 范围结束点(不含)

select bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) as result
2.bitmapSubsetLimit

将位图指定范围(起始点和数目上限)转换为另一个位图

bitmapSubsetLimit(bitmap, range_start, limit)
注:
bitmap – 位图对象
range_start – 范围起始点(含)
limit – 子位图基数上限

select bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) as result

(五)位图运算

1.bitmapHasAny

与hasAny(array,array)类似,如果位图有任何公共元素则返回1,否则返回0。
对于空位图,返回0。

bitmapHasAny(bitmap,bitmap)
注:bitmap – bitmap对象

select bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
2.bitmapHasAll

与hasAll(array,array)类似,如果第一个位图包含第二个位图的所有元素,则返回1,否则返回0。
如果第二个参数是空位图,则返回1。

bitmapHasAll(bitmap,bitmap)
注:bitmap – bitmap 对象

select bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
3.bitmapAnd

为两个位图对象进行与操作,返回一个新的位图对象

bitmapAnd(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
4.bitmapOr

为两个位图对象进行或操作,返回一个新的位图对象

bitmapOr(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
5.bitmapXor

为两个位图对象进行异或操作,返回一个新的位图对象

bitmapXor(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
6.bitmapAndnot

计算两个位图的差异,返回一个新的位图对象

bitmapAndnot(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
7.bitmapAndCardinality

为两个位图对象进行与操作,返回结果位图的基数

bitmapAndCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
8.bitmapOrCardinality

为两个位图进行或运算,返回结果位图的基数

bitmapOrCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
9.bitmapXorCardinality

为两个位图进行异或运算,返回结果位图的基数

bitmapXorCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
10.bitmapAndnotCardinality

计算两个位图的差异,返回结果位图的基数

bitmapAndnotCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象

select bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result

四、总结

位图对象有两种构造方法。其一是由聚合函数groupBitmapState构造的,其二是由Array Object构造的。同时还可以将位图对象转化为数组对象。对于任何一个位图函数,计算结果都将返回一个位图对象。带有Has的判断函数返回的数值是逻辑值0或者1;带有Cardinality后缀的函数返回的数值是运算后的结果位图的基数;其他的位图运算返回的是结果位图,例如And,Or,Xor,Andnot等。

### ClickHouse 中的模糊查询方法 ClickHouse 提供了几种方式来实现模糊查询功能,尽管其设计初衷并非专门针对全文检索或复杂的模糊匹配场景。以下是几种常用的方法及其示例: #### 1. 使用 `LIKE` 和 `ILIKE` `LIKE` 是 SQL 标准中的字符串模式匹配操作符,适用于简单的通配符匹配。`ILIKE` 则是大小写不敏感版本。 ```sql SELECT * FROM table_name WHERE column_name LIKE '%pattern%'; ``` 如果需要忽略大小写,则可以使用 `ILIKE`(需启用 PostgreSQL 兼容语法)[^1]。 #### 2. 正则表达式查询 (`REGEXP`, `MATCH`) ClickHouse 支持基于 POSIX 的正则表达式查询,可以通过 `REGEXP` 或 `MATCH` 关键字完成更灵活的模糊匹配。 ```sql SELECT * FROM table_name WHERE column_name REGEXP 'pattern.*example'; ``` 或者使用 `MATCH` 函数: ```sql SELECT * FROM table_name WHERE match(column_name, 'pattern.*example'); ``` 这种方式非常适合处理复杂模式的匹配需求,但需要注意的是,正则表达式的性能可能不如其他简单匹配方式高效[^2]。 #### 3. nGram 和 Tokenize 插件 对于更高级的模糊查询需求,比如近似匹配或拼写纠正,可以借助第三方插件如 `ngrambf_v1` 或自定义函数实现分词和相似度计算。这种方法通常涉及预处理阶段创建辅助列以提高查询效率。 例如,在表结构中增加一列存储 tokenized 数据: ```sql CREATE TABLE example_table ( id UInt64, text String, tokens Array(String) MATERIALIZED tokenize(text) ) ENGINE = MergeTree() ORDER BY id; ``` 之后可通过数组操作筛选符合条件的结果: ```sql SELECT * FROM example_table WHERE has(tokens, 'token') OR hasAny(tokens, ['tok', 'en']); ``` 此方案特别适合中文等非空白字符分割的语言环境下的模糊查找任务[^3]。 #### 4. MinHash 和 Jaccard 相似度 当面对海量数据集时,精确去重可能会带来巨大的计算开销。此时可采用概率算法如 MinHash 来估算集合间的相似程度,并据此判断两条记录是否接近相同。 假设我们已经构建好了对应的 Bitmap 结构,则比较过程如下所示: ```sql WITH jaccardSimilartiy(bitmapA, bitmapB) AS similarity_score SELECT similarity_score FROM dual; ``` 这里利用到了之前提到过的 RoaringBitmap 技术细节,即通过高效的位图运算快速得出候选结果集后再进一步验证真伪阳性情况[^3]。 以上便是关于如何在 ClickHouse 实现不同层次上的模糊查询的一些探讨与实践案例分享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值