Doc Values :
在Elasticsearch中,检索时使用的是倒排索引,即一个词找到对应的文档列表映射;倒排索引能够快速查找包含某项的文档,但是对于聚合排序的操作并不高效。
在聚合排序操作时,通过在倒排索引基础上建立的正排索引数据结构来完成,即一个文档到词的列表映射,正排索引就是列式存储,它在数据字段的一列存储所有value,在排序聚合操作上回表现的更加高效,在es中被称为doc_values,它将所有单字段存储在单数列中,可以使聚合更快、更高效并且内存友好。
Doc Values是一种列式存储结构,在索引创建时与倒排索引同时生成,都是基于Segment生成并不变的,并序列化到磁盘。常被应用到以下场景:对字段进行排序或者聚合操作,某些过滤以及字段相关的脚本计算。
倒排索引能够基于一个词,快速访问包含耨个词的文档列表。但在排序,聚合的时候需要一种结构能够查询到文档到词的映射,这个时候倒排索引无法高效完成,eg:
当想要找到一个包含"brown"的文档,我们可以基于倒排索引快速访问到包含"brown"的文档,比如"doc_1"和"doc_2",然而,在聚合部分,我们需要找doc_1和doc_2中找到所有的词,在倒排索引完成代价很高,即不得不迭代索引中的每一个词,是否包含在doc_1和doc_2中,这个过程非常缓慢,因为随着文档词量增加,执行聚合的诗句就会随之增加。
通过以下查询体得到包含brown的文档的词的完整列表: