有没有办法选择 n 个存储桶,并使用存储桶的 doc_count 的范围过滤器以一种“即时”跳过存储桶的方式应用

时间:2021-06-24 15:07:00

标签: elasticsearch elasticsearch-aggregation elasticsearch-7

事实

  1. 我们有大约 1000 万家公司发布的大约 8500 万份文件(索引大小为 93GB)
  2. 一家公司创建一个存储桶,因此大约有 1000 万个存储桶。

什么效果好

当对公司字段使用 termAggregation 进行聚合时,结果将毫无问题地返回,首先列出符合用户输入的特定条件的大多数文档的公司。 前 6 个 1000 个桶的 doc_counts 示例(设置了 size=1000)

  • company_a:45000
  • company_b:40000
  • company_c:38000
  • company_d:35000
  • company_e:32000
  • company_f:31000

什么不起作用

仅选择具有某些最大和最小大小的存储桶(例如,最小:31000,最大:32000)。这无法在 termAggregation 级别实现,因为此选项不可用。

此处 termAggregation 的唯一选项是“min_doc_count”,但没有“max_doc_count”。

更新:我已经使用此功能 (WIP) 在 ElasticSearch 的 github 上创建了 PR

不是解决方案

  1. 这里不能使用Bucket select聚合,因为总bucket大小太大(超过1000万家公司-应该考虑所有bucket)。想象一下,我们需要选择 100-1000 范围内的桶(比最大的桶更频繁)。
  2. 无法使用具有预聚合计数的辅助索引,因为可以同时应用多个其他过滤器(例如国家/地区:美国,类别:红色等)

标题中的问题:有没有办法用范围过滤器为存储桶的 doc_count 选择 1000 个存储桶,以一种“即时”跳过存储桶的方式应用

假想聚合:

termAgregation("companies", "company").size(10).minDocCount(100).maxDocCount(1000)

0 个答案:

没有答案