Lucene DocValues详解
我们已经知道倒排表存储了term 对就在的 docIds,也就是说我们可以用它非常高效的找到所有含有查询词的文档得到一个结果集。这个结果集含有满足查询条件的docid(即文档号),这个结果集极有可能非常大。
这里有两个非常重要的件:1. 结果集只有含文档号,不含文档的内容;2. 这个结果集很大,有很多个文档号。
当然一般来我们并不需要整个结果集,只需要按一定条件topK。
当一定条件是指按相似度(Similarity得分)排序时,倒排索引依然非常完美。
当一定条件是指除相似度排序之外,还需要依赖文档的一个或者多个字段时(即sort=f desc),其实是不是必须读取原文档,然后对应字段拿出来排序呢?答案是肯定。
DocValues字段是一个面向列存储的字段,一个Segment只有一个DocValues文件。也就是被DocValues标记的字段在建索引时会额外存储文件到值的映射关系,存储这个映射的文件叫DocValues data,简称**.dvd**。对应的元数据文件叫**.dvm**:DocValues Metadata。
这里metadata相当于Index文件,用来存储数据的索引,也就是存储数据文件每条记录起始位置以及记录的长度,同时存储数据文件的数据格式等信息(即是元信息)。
DocValues解决是从文档号到值的映射关系的问题,前面也谈到了什么情况下需要用到正向索引。即是在大量结果集里通过少量字段进行大规模筛选过滤候选文档时,DocValues可以显著减少IO时间和降低运算量。
在以下情况下建议使用DocValues
facet
facet名为切面检索,其实从这个名称里很难看出什么端倪来。但我们一般说Facet是字段分类统计,即是搜索结果以按指定字段按它的值进行分类统计。如果按这个说法的话,我们应该很好理解DocValues下Facet会更高效。因为它在搜索结果里按字段的值进行分类统计,所以可以说它主要关注文档中具体某个字段的值。
group by
Group By,即是分组。我们都知道分组的依据是字段的值,按字段的值进行分类。因此它也是更加关注某个或某几个字段的值为主。
sort
Sort在文章开始时给出来的实例就是讲DocValues在Sort情场下的应用 。
另可参加 https://blog.csdn.net/asdfsadfasdfsa/article/details/71576750

浙公网安备 33010602011771号