在ElasticSearch文档中的"基数聚合"标题下;预先计算的散列";我看到以下内容:
对于基数较高的字符串字段将字段值的哈希存储在索引中,然后运行此字段上的基数聚合。这可以通过从客户端或通过让Elasticsearch提供哈希值使用mapper-murmur3插件为您计算哈希值。
预计算散列通常只在非常大和/或高基数字段,因为它节省了CPU和内存。然而,在数字字段,哈希非常快,可以存储原始值所需的内存与存储哈希一样多或更少。这也是在低基数字符串字段上为true,特别是考虑到进行优化,以确保在每个段的每个唯一值最多一次。
我很好奇它上面写着";[这可以通过从客户端提供散列值来实现];因为它根本没有详细说明这一点,而是继续讨论数值字段。
如果我想在客户端上预先计算哈希,那么使用类似xxhash的东西并将结果放入适当的数字字段就足够了吗?(当然,让基数以该字段为目标。(或者我需要使用另一种类型的字段作为哈希值吗?
为高基数字符串字段预先计算散列将加快基数聚合,因为散列不必实时计算。不过,不需要对数字字段执行此操作!
对于字符串字段,他们建议使用mapper-murmur3
插件。这些散列将是字母数字的,应该存储在keyword
字段中(而不是数字字段类型!(,然后在基数聚合中使用。
在使用预先计算的散列计算高基数字符串字段的基数时,我个人看到了10x+的改进。值得一试!