elasticsearch - 使用组对聚合进行分区

标签 elasticsearch aggregate partitioning

我正在尝试对类似于 the example 的聚合进行分区在 ElasticSearch 文档中,但没有让示例工作。

索引填充了事件类型:

public class Event
{
    public int EventId { get; set; }
    public string SegmentId { get; set; }
    public DateTime Timestamp { get; set; }
}
EventId是唯一的,每个事件都属于特定的 SegmentId .每个 SegmentId 可以与零到多个事件相关联。

问题是:
如何获取最新的EventId对于每个 SegmentId ?

我预计独特片段的数量将在 1000 万个范围内,独特事件的数量会大一到两个数量级。这就是为什么我不认为使用 top_hits单独使用是合适的,如 suggested here .因此,分区。

示例:

我设置了一个演示索引,其中包含 1313 个文档(唯一 EventId ),属于 101 个不同的 SegmentId (即每段 13 个事件)。我希望下面的查询能够工作,但无论 partition 是哪个,都会返回完全相同的结果。我指定的号码。
POST /demo/_search
{
  "size": 0,
  "aggs": {
    "segments": {
      "terms": {
        "field": "segmentId",
        "size": 15,                  <-- I want 15 segments from each query
        "include": {
          "partition": 0,            <-- Trying to retrieve the first partition
          "num_partitions": 7        <-- Expecting 7 partitions (7*15 > 101 segments)
        }
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,
            "_source": [
              "timestamp",
              "eventId",
              "segmentId"
            ],
            "sort": {
              "timestamp": "desc"
            }
          }
        }
      }
    }
  }
}

如果我删除 include并设置size值大于 101,我得到每个段的最新事件。但是,我怀疑这是一个拥有一百万桶的好方法......

最佳答案

您正在尝试执行 Scroll的聚合。

Scroll API 仅支持搜索查询,不支持聚合。如果您不想使用 Top Hits,正如您所说,由于大量文档,您可以尝试:

  • Parent/Child方法 - 您在其中创建段作为父文档和子文档中的事件。并且每次添加 child 时,都可以更新父文档中的时间戳字段。通过这样做,您可以只查询父文档,您将获得您的段 id + 最后一个事件时间戳
  • 另一种方法是您尝试仅在过去 24 小时内获得热门歌曲。因此,您可以添加查询以首先过滤过去 24 小时,然后尝试使用 top_hit 获取 aggs。
  • 关于elasticsearch - 使用组对聚合进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43370197/

    相关文章:

    wcf - 使用filebeat传送元素之间没有换行符的XML数据

    elasticsearch - 如何在基于字段的 Elasticsearch 中获取唯一文档,以及如何基于其他字段 'group by'结果

    mysql - 如何在 Mysql 中对 json_arrayagg() 返回的数组进行排序?

    mysql - 表增长后优化 MySQL 操作的最佳方法

    scala - 如何在 Spark 中对每个执行器执行一次操作

    java - 使用 Elastic Search 6.2.3 在 AWS EC2 上运行 Spring Boot 2.0.3 应用程序

    elasticsearch - TransportError(403, u'cluster_block_exception', u'blocked by : [FORBIDDEN/12/index read-only/allow delete (api)];')

    python - pd.NamedAgg 中的矢量化百分位数

    python - 计算 MAD(平均绝对偏差)GroupBy Pandas

    algorithm - 解决具有额外约束的分区的正确算法是什么?