#2114·tantivy

支持 f64 压缩

作者: PSeitz创建于 2023年7月11日更新于 2026年9月9日

问题大纲

目前,Tentivy存储f64值在其柱形存储中每值有8字节未压缩. 一般浮点数不适合比特打包,这需要与现有的编码器不同的方法.

数据集

一些包含浮动数字的数据集.

纽约出租车

所有浮点值似乎都相对较低,最高可达两个小数.

贾森 {"DOLOcationID":140""PULOCationID":239""atecodeID":1""VendorID":1"Airport fee":nall"摄取-充电":nell""Extra":0.5","fare amount":14.0"改进-充电":0.3"mta Tax":0.5"客机":1"支付-类型":2"存储-和 fwd flag":"N"tip amon":0.0"to amount""15.3""tpep off date-time":"2018-01-01:01:03+00:""tpep cook-datetime":":"2018-01-01-001-01:00:44+00:00:00:00:00"""","Trip 距离"2.7}


台湾空气质量
和出租车数据集相同 - 低红度,可达2个小数.

贾森
{"AQI":26"CO":"0.37""CO 8hr":0.42""County":"臺北市""DataCreation Date":"2016-11-25/1""纬度":""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

诺克温度 240k 温度在-99.0至60.0之间 838个独特价值

QQ Sec gov 日志 - EDGAR 日志 有点奇怪,所有数字都有.0'后缀。 有些是高度重复的,如代码'。 数字为十进制,甚至为.0',在serde json'中被认为是浮动。 贾森 {"加入":"0001351930-07-000004" "时间":"00:00" "区":0.0" "noagent":0.0""代码":200.0""日期":"2017-06-30" "cik":13722111.0""保留":"-index.htm" "idx":1.0"浏览器" "crawler":0.0"ip" "107.23.85.jfd" "大小:275.6.0" "norefer"""0.0""find":0.0"find"":0.


# 小数检测
f64压缩的一种方法是在小数点数相对较少(例如小于2)时检测出小数点值.
一个非常简单的算法可以仅仅检查未分解数字的长度,因为字符串很短.

数字随后可以作为十进制而不是浮式存储,例如100.23 + 10023 + 数字十进制(2)

词典压缩
词典压缩通过将所有独有的值放入词典来工作,然后只存储被拼接到的正文位. 对少数人来说是不错的
独特的价值。

考虑两种可能的方法:全球字典压缩和每块压缩的字典.

QQ 全球词典压缩
根据全域词典压缩方案,一个片段中的所有数据都维持一个单词典. 这种方法的有效性取决于数据分布. 例如,在Zipf定律或双模式分布之后的数据分布预计不会很合适。

已保存的 num 位值 vs f64 =
`64 * num 值 - [每个val(64 - numm bits dict)所保存的 num 位值 * 值数] - [numm 值指向 [numm bits dict]'

每个块压缩的词典
. . . . . . .

内容来源: quickwit-oss/tantivy