ElasticSearch可以聚合每个已排序存储桶中的前N个项目

时间:2016-11-29 00:25:27

标签: elasticsearch

我有这个查询按数据源代码存储记录,并计算每个存储桶中所有记录的平均值。

我如何修改它,以便每个存储桶在按record.timestamp desc(或任何其他记录字段)排序时仅限于(最多)前N条记录

我想要的最终效果是使用最新的N条记录而不是所有记录的每桶的平均值(因此每个存储区中的doc_count的上限为N)。

我进行了广泛的搜索和实验但没有成功。

当前查询:

{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "jobType": "LiveEventScoring"
              }
            },
            {
              "term": {
                "host": "MTVMDANS"
              }
            },
            {
              "term": {
                "measurement": "EventDataLoadFromCacheDuration"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "data-sources": {
      "terms": {
        "field": "dataSourceCode"
      },
      "aggs": {
        "avgDuration": {
          "avg": {
            "field": "elapsedMs"
          }
        }
      }
    }
  }
}

结果:

"aggregations": {
    "data-sources": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "AU_VIRT",
          "doc_count": 6259,
          "avgDuration": {
            "value": 3525.683176226234
          }
        },
        {
          "key": "AU_HN_VIRT",
          "doc_count": 2812,
          "avgDuration": {
            "value": 3032.0771692745375
          }
        },
        {
          "key": "GB_VIRT",
          "doc_count": 1845,
          "avgDuration": {
            "value": 1432.39945799458
          }
        }
      ]
    }
  }
}

或者,如果无法从排序的存储桶中抓取前N个,我可以为每个dataSourceCode执行多个查询,例如,对于AU_VIRT:

{
  "size":0,
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "jobType": "LiveEventScoring"
              }
            },
            {
              "term": {
                "host": "MTVMDANS"
              }
            },
            {
              "term": {
                "dataSourceCode": "AU_VIRT"
              }
            },
            {
              "term": {
                "measurement": "EventDataLoadFromCacheDuration"
              }
            }
          ]
        }
      }
    }
  },
      "aggs": {
        "avgDuration": {
          "avg": {
            "field": "elapsedMs"
          }
        }
      }

  }
}

但我现在面临的挑战是如何使avgDuration在按时间戳描述排序的前N个结果中工作。

0 个答案:

没有答案