3 个版本 (重大更改)
0.3.0 | 2024年4月12日 |
---|---|
0.2.0 | 2023年9月1日 |
0.1.0 | 2023年6月9日 |
#77 in 数据库实现
426,484 每月下载量
在 32 个crate中使用 (直接使用2个)
740KB
17K SLoC
列式格式
本crate描述了 tantivy 中使用的列式格式。
目标
此格式具有以下特殊之处。
- 需要紧凑
- 访问特定列不需要加载整个列式。这可以在 2 到 3 次随机访问中完成。
- 具有相同列名的多个类型的列可以关联。
- 需要支持不同类型和不同基数(必需、可选、多值)的列。
- 一旦加载,列提供廉价的随机访问。
- 设计用于允许范围查询。
强制规则
用户可以通过向 ColumnarWriter
插入行来创建列式,并将其序列化为 Write
对象。没有阻止用户将不同类型的值记录到同一 column_name
中。
在这种情况下,tantivy-columnar
的行为如下
- JsonValues 被分组为 3 种类型(String、Number、bool)。对应不同组的值映射到不同的列。例如,String 值独立于 Number 或布尔值处理。
tantivy-columnar
将简单地发出与给定列名关联的多个列。 - 对于给定的json值类型,只发出一个列。如果记录了不同数字类型(例如u64、i64、f64)的数字值,
tantivy-columnar
将选择第一个可以表示附加值的集合的类型,以下列出的优先顺序(i64
、u64
、f64
)。i64
被选中而不是u64
,因为它不太可能改变类型。大多数严格要求u64
的使用案例显示了对50%的值的限制(例如64位哈希)。另一方面,许多使用案例可以显示罕见的负值。
列式格式
此列格式可能关联到同一column_name
的多个列(具有不同类型)(见上面的强制规则)。然而,(column_name, columne_type)
对唯一地标识一个列。这对序列化为列column_key
。该键的格式为:[column_name][ZERO_BYTE][column_type_header: u8]
COLUMNAR:=
[COLUMNAR_DATA]
[COLUMNAR_KEY_TO_DATA_INDEX]
[COLUMNAR_FOOTER];
# Columns are sorted by their column key.
COLUMNAR_DATA:=
[COLUMN_DATA]+;
COLUMNAR_FOOTER := [RANGE_SSTABLE_BYTES_LEN: 8 bytes little endian]
列文件从实际的列数据开始,按列键顺序连接。
一个sstable将`(column name, column_cardinality, column_type)`关联到字节数的范围。
列名不能包含零字节\0
。
因此,可以通过列出所有以[column_name][ZERO_BYTE]
为前缀的键来列出与column_name
关联的所有列。
相关的字节数范围指的是字节数的范围
此crate公开了tantivy的列格式。该格式在README.md中描述
该crate引入了以下概念。
Columnar
是数据框的等价物。它将column_key
映射到Column
。
Column<T>
将一个RowId
(u32)关联到任意数量的值。
这是通过包装一个ColumnIndex
和一个ColumnValue
对象来实现的。ColumnValue<T>
代表一个映射,将每个RowId
关联到恰好一个值。
然后,ColumnIndex
将每个RowId映射到ColumnValue
中的RowId集合。
为了优化和压缩,ColumnIndex
有三种可能的表示,每种表示都针对不同的基数。
- 完整
所有RowId都有确切的一个值。ColumnIndex是平凡的映射。
- 可选
所有RowIds最多可以有一个值。ColumnIndex是平凡的映射ColumnRowId -> Option<ColumnValueRowId>
。
- 多值
所有RowIds可以有任意数量的值。列索引将值映射到范围。
所有这些对象都独立于各自的模块实现并进行了单元测试
- columnar
- column_index
- column_values
- column
依赖项
~8MB
~128K SLoC