我有一个大表(~1B 行),btree
在单列上有一个索引bytea
(~20GB,但适合内存)。
我想使用概率过滤器(例如布隆过滤器或布谷鸟过滤器)从客户端发送查询,并让数据库扫描索引,收集所有可能与过滤器匹配的行。这应该返回所有可能的匹配项和一些误报。目标是避免提供所请求项目的完整列表(出于隐私考虑 - 客户端有一个列表,但不能与服务器共享它)。
我看到 Postgres 有一个用于创建基于布隆过滤器的索引的bloom
模块,但我认为它不能用于针对btree
索引测试查询中提供的布隆过滤器。
我想最终结果看起来像:
SELECT key, value FROM table WHERE matches_filter(key, b'01010101010101');
有什么方法可以在这里重用bloom
模块中的内部方法吗?或者是否有任何暴露概率过滤功能的扩展?
无论您拥有多少 RAM,您都无法拥有 20GB 的字节值。最大为 1GB。并且你不能在任何地方接近那么大的 btree 索引值——但不清楚为什么你指定 btree,因为你还谈到了创建新的索引类型。
您可以做的是使用众所周知的散列函数(如 md5 或 sha256)来消化客户端上的完整值,然后将其截断到您认为可能发生冲突的长度,然后将截断后的值发送到服务器搜索。然后,服务器可以发回所有匹配的全长摘要。(或者它可以发回完整长度的文档,但如果它们大于 1GB,则不会)。这样你就可以知道你的文档(或者它的哈希摘要)是否已经在数据库中,但是数据库不知道哪些(如果有的话)是你想要搜索的。一个常规的 btree 索引就足够了。