首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在过滤结果之前,如何根据时间戳对elasticsearch桶进行排序?

在过滤结果之前,如何根据时间戳对elasticsearch桶进行排序?
EN

Stack Overflow用户
提问于 2021-05-31 13:58:50
回答 1查看 375关注 0票数 0

我的用例如下:

我在elasticsearch上有文档,我保存了一些遥测数据,并在将其聚合到弹性搜索之前(每个文档都有一个计数字段,该字段可以告诉这个事件发生了多少次)。

json字段的示例:

代码语言:javascript
复制
{
   "timestamp": "2021-06-05T06:53:25.275172"
   "count": 5
   "name": "myname",
   "type: "mytype",
   "sub_type": "mysubtype"
},
{
   "timestamp": "2021-05-05T07:53:25.275172"
   "count": 2
   "name": "myname",
   "type: "mytype",
   "sub_type": "zzzzzmysubtype222"
}
{
   "timestamp": "2021-04-05T06:22:25.275172"
   "count": 1
   "name": "myname",
   "type: "mytype",
   "sub_type": "mysubtype"
},

我正在执行一个查询,以聚合所有“唯一”文档(按名称、类型和sub_type),同时计算响应总数,并且我希望按照时间戳对桶进行排序。

问题是,我有一个“限制”参数,它限制了接收结果的数量,当我将其限制为1时,我不会得到最新的事件桶(据我所知,它按3个字段对它们进行排序,然后限制大小,然后再对其进行排序)。

所以,当运行下面的查询时-我想得到"myname,mytype,mysubtype",但实际上我得到了"myname,mytype,zzzzzmysubtype222“作为第一个桶。如果我提高限制-那么它是正确的排序。

这是我的疑问:

代码语言:javascript
复制
{
        "query": {
            "bool": {
                "filter": [{"range": {"timestamp": {"lte": "now", "gte": "2020-06-05"}}}],
            }
        },
        "aggs": {
            "events": {
                "composite": {
                    "size": 1,    <----------- this doesn't give me latest bucket
                    "sources": [
                        {"name": {"terms": {"field": "name.keyword"}}},
                        {"type": {"terms": {"field": "type.keyword"}}},
                        {"sub_type": {"terms": {"field": "sub_type.keyword"}}},
                    ],
                },
                "aggs": {
                    "events_count": {"sum": {"field": "count"}},
                    "latest_event": {"top_hits": {"sort": [{"timestamp": {"order": "desc"}}], "size": 1}},
                    "top_hit": {"max": {"field": "timestamp"}},
                    "events_bucket_sort": {"bucket_sort": {"sort": [{"top_hit": {"order": "desc"}}]}},
                },
            }
        },
        "size": 0,
    }

所以,我想要做的是按照最新的事件时间戳(top_hit)对桶进行排序--任何帮助都将不胜感激。

我想这和订单有关

但是时间戳不应该聚合,所以我如何控制水桶的自然类型?我只需要先收到最新的,不管大小,

如果不可能,是否可以获得共享多个公共字段的唯一文档聚合?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-01 03:10:07

就我所能理解的问题而言,您需要基于nametypesub_type字段的唯一桶,然后根据形成的桶,您需要获得最新的桶(基于时间戳)。

如果您希望获得基于多个字段的唯一桶,可以使用多项聚合和top_hits聚合来根据时间戳获得最新的桶。

代码语言:javascript
复制
{
  "size": 0,
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "name.keyword"
          },
          {
            "field": "type.keyword"
          },
          {
            "field": "sub_type.keyword"
          }
        ]
      }
    },
    "latest_event": {
      "top_hits": {
        "sort": [
          {
            "timestamp": {
              "order": "desc"
            }
          }
        ],
        "size": 1
      }
    }
  }
}

搜索结果:

代码语言:javascript
复制
"aggregations": {
    "genres_and_products": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": [
            "myname",
            "mytype",
            "mysubtype"
          ],
          "key_as_string": "myname|mytype|mysubtype",
          "doc_count": 2
        },
        {
          "key": [
            "myname",
            "mytype",
            "zzzzzmysubtype222"
          ],
          "key_as_string": "myname|mytype|zzzzzmysubtype222",
          "doc_count": 1
        }
      ]
    },
    "latest_event": {
      "hits": {
        "total": {
          "value": 3,
          "relation": "eq"
        },
        "max_score": null,
        "hits": [
          {
            "_index": "67775188",
            "_type": "_doc",
            "_id": "1",
            "_score": null,
            "_source": {
              "timestamp": "2021-06-05T06:53:25.275172",
              "count": 5,
              "name": "myname",
              "type": "mytype",
              "sub_type": "mysubtype"
            },
            "sort": [
              1622876005275
            ]
          }
        ]
      }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67775188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档