doc_values 在 ElasticSearch 中如何工作

era*_*ran 1 elasticsearch

有人可以向我解释 doc_values 是如何工作的吗?为什么这对我进行聚合时有帮助?

过滤时对我有帮助吗?

对于过滤,在我看来,ElasticSearch 将访问倒排索引以查找指向适合聚合的所有文档的“指针”,因此 doc_values(根据文档,它是一个“非倒排索引”)是无关紧要的吗?还是我错了?

有人可以解释一下启用 doc_values 时和未启用时聚合的流程,以及为什么启用它可以节省内存吗?

谢谢。

And*_*fan 5

关于以下的一般陈述doc_values

  • doc_values将有助于内存的使用
  • 它们用于称为的内存部分fielddata
  • fielddata在排序、聚合、使用访问字段值的脚本、使用父子关系和地理距离过滤器时使用

doc_values发挥作用之前, fielddata 被加载到堆中doc_values不会使用堆,而是使用堆外的内存——文件系统缓存,因为doc_values会驻留在文件系统中。Lucene将访问文件系统,操作系统将其缓存在文件系统缓存中,然后从那里处理请求。

为什么这很重要:堆的大小有限,建议堆大小不要超过 30 GB。堆还包含其他部分:过滤器缓存、查询缓存、索引缓冲区、段文件中的元数据等。Fielddata 通常占用大量空间,不是因为效率低下,而是因为 ES 需要加载所有将文档存入内存,以便对其进行排序、聚合。对于较大的索引(隐式地,分片),这意味着大量的数据。

这就是doc_values引入的原因:将所有这些负担从堆(这是有限的)转移到操作系统文件系统缓存(这也是有限的,但肯定会减少压力)。

doc_values它本身不会帮助您进行聚合。doc_values表示字段数据。Fielddata 对于聚合是必需的doc_values将帮助您处理内存的使用。