3 个版本 (重大更改)

0.3.0 2024年4月12日
0.2.0 2023年9月1日
0.1.0 2023年6月9日

#77 in 数据库实现

Download history 42192/week @ 2024-05-02 37391/week @ 2024-05-09 41383/week @ 2024-05-16 43451/week @ 2024-05-23 101143/week @ 2024-05-30 116460/week @ 2024-06-06 102486/week @ 2024-06-13 144512/week @ 2024-06-20 153034/week @ 2024-06-27 109024/week @ 2024-07-04 120409/week @ 2024-07-11 117076/week @ 2024-07-18 124756/week @ 2024-07-25 111993/week @ 2024-08-01 91158/week @ 2024-08-08 73057/week @ 2024-08-15

426,484 每月下载量
32 个crate中使用 (直接使用2个)

MIT 许可证

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将选择第一个可以表示附加值的集合的类型,以下列出的优先顺序(i64u64f64)。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