TianEx / Blog

My blog ~
1 stars 0 forks source link

Lucene DocValues详解 #57

Open TianEx opened 5 years ago

TianEx commented 5 years ago

倒排索引,顾名思义就是从term反向查找到文档,存储结构是term对应包含该term的doc集,倒排索引是全文索引的基础。 正向索引,则是通过docid找到字段值。

对于倒排索引,我们可以使用它高效找到包含指定term的结果集(其中包含了对应的docid,但不包含文档内容),而这个结果集可能非常大(按照score等相关性topK)。对此按照正向索引的定义,根据docid直接找到term所以又称为列存储。 对于倒排索引的结果集是只包含doc id,而不含内容,同时结果集可能非常大,有很多doc id。

DocValues字段是一个面向列存储的字段,一个Segment只有一个DocValues文件,DocValues通过牺牲一定的磁盘空间,一是节省了内存,二是对排序、分组和聚合操作能大大提升性能。DocValues其实是Lucene在建立索引时会额外建立一个有序的基于doc->field value的映射列表。

倒排索引是搜索的核心,而正向索引则是为了优化搜索结果的排序和统计能力

如上所述,经典的倒排索引检索term非常快,但是在需要对数据进行聚合排序等操作时,Lucene内部会遍历提取所有结果集的排序字段进行再次构建文档集。 基于此,在构建索引时对DocValues字段构建映射关系减轻了在排序和分组时对内存的依赖。

TianEx commented 4 years ago

在大量结果集中通过少量字段进行大规模筛选过滤候选文档时,DocValues可以有效减少I/O和CPU开销。 比如:Facet(根据指定字段分类统计)、Group BY、Sort等。