【问题标题】:Elasticsearch "size" value not working in terms aggregation with partitionsElasticsearch“大小”值不适用于分区聚合
【发布时间】:2021-01-20 04:11:03
【问题描述】:

我正在尝试使用带有分区的术语聚合对特定字段进行分页。 问题是每个partition返回的term数量不等于我设置的size参数。

这些是我正在做的步骤:

  1. 检索具有“基数”聚合的字段的不同唯一值的数量。 在我的数据中,结果是 21。

  2. 从网页中,用户想要显示一个每页包含 10 个项目的表格。

    if unique_values % page_size != 0:
            partitions_number = (unique_values // page_size) + 1
        else:
            partitions_number = (unique_values // page_size) 
    

比我做这个简单的查询:

POST my_index/_search?pretty
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "field_to_paginate": "foo"
          }
        }
      ]
    }
  },
  "aggs": {
    "by_pchostname": {
      "terms": {
        "size": 10,
        "field": "field_to_paginate",
        "include": {
          "partition": 0,
          "num_partitions": 3
        }
      }
    }
  }
}

我期望检索 10 个结果。但如果我运行查询,我只有 7 个结果。 我在这里想念什么?我需要在这里使用不同的解决方案吗?

附带说明,我不能使用复合聚合,因为我需要在整个数据集上按 doc_count 对结果进行排序。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    在聚合方面的分区将值分成相等的块。

    在您的情况下,num_partitions 的分区编号为 3,因此 21/3 == 7。

    分区用于获取大约 1000 秒的大值。

    【讨论】:

    • 它们没有被分成相等的块。我有 350 万个项目和 100,000 个分区,桶的大小从 25 到 41 不等。术语聚合旨在返回最重要的术语,并且不允许分页。
    【解决方案2】:

    您可以利用shard_size 参数。我的建议是read this part of manual 并使用 shard_size 参数

    【讨论】:

      【解决方案3】:

      术语聚合不允许分页。改用复合聚合(需要 ES >= 6.1.0)。以下是reference docs的引用:

      如果你想检索所有术语或术语的所有组合 嵌套术语聚合,您应该使用 Composite 聚合 这允许对所有可能的术语进行分页,而不是设置 大小大于术语中字段的基数 聚合。术语聚合旨在返回最重要的术语 并且不允许分页。

      【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多