elasticsearch 如何在Elasticsearch中对同一文档进行最大日期聚合?,elasticsearch,elasticsearch" /> elasticsearch 如何在Elasticsearch中对同一文档进行最大日期聚合?,elasticsearch,elasticsearch" />

elasticsearch 如何在Elasticsearch中对同一文档进行最大日期聚合?

elasticsearch 如何在Elasticsearch中对同一文档进行最大日期聚合?,elasticsearch,elasticsearch,我有数以百万计的文档,其块如下所示: { "useraccountid": 123456, "purchases_history" : { "last_updated" : "Sat Apr 27 13:41:46 UTC 2019", "purchases" : [ { "purchase_id" : 19854284, "purchase_date" : "Jan 11, 2017 7:53:35 PM" },

我有数以百万计的文档,其块如下所示:

{
  "useraccountid": 123456,
  "purchases_history" : {
    "last_updated" : "Sat Apr 27 13:41:46 UTC 2019",
    "purchases" : [
      {
        "purchase_id" : 19854284,
        "purchase_date" : "Jan 11, 2017 7:53:35 PM"
      },
      {
        "purchase_id" : 19854285,
        "purchase_date" : "Jan 12, 2017 7:53:35 PM"
      },
      {
        "purchase_id" : 19854286,
        "purchase_date" : "Jan 13, 2017 7:53:35 PM"
      }
    ]
  }
}
我正在努力想办法做一些事情,比如:

按useraccountid从我的索引组中选择useraccountid,max(采购历史记录.采购.采购日期)

我只找到了最大聚合,但它聚合了索引中的所有文档,但这不是我需要的。我需要找到每个文档的最大购买日期。我相信一定有一种方法可以迭代每个文档的每个路径购买历史记录.purchases.purchaseu日期,以确定哪一个是最长购买日期,但我真的找不到该怎么做(如果这真的是最好的方法的话)


有什么建议吗?

我假设您的字段
useraccountid
是唯一的。您必须进行术语聚合,在内部进行最大聚合。我可以这样想:

"aggs":{
    "unique_user_ids":{
        "terms":{
            "field": "useraccountid",
            "size": 10000 #Default value is 10
        },
        "aggs":{
            "max_date":{
                "max":{
                    "field": "purchases_history.purchases.purchase_date"
                }
            }
        }
    }
}
聚合
字段中,您将首先看到唯一的用户ID及其最长日期

请注意尺寸中的10000。
terms
聚合只建议返回10000个结果

如果你需要更多,你可以玩。这样,您就可以对结果进行分页,您的集群就不会出现性能问题

如果你想玩Composite,我可以想到以下几点:

GET /_search
{
    "aggs" : {
        "my_buckets": {
            "composite" : {
                "size": 10000, #Default set to 10
                "sources" : [
                    { "user_id": { "terms": {"field": "useraccountid" } } },
                    { "product": { "max": { "field": "purchases_history.purchases.purchase_date" } } }
                ]
            }
        }
    }
}
运行查询后,它将在\u key之后返回一个名为
的字段。使用该字段,您可以将结果分页为10000个元素的页面。请看下面的图片


希望这有帮助!:非常感谢你的帮助!我甚至不知道这些特征的存在。我只需要在复合块内部进行调整以使其正常工作:
“composite”:{“size”:1000,“sources”:[{“user\u account\u id”:{“terms”:{“field”:“user\u account\u profile.user\u account\u id”}},“aggs”:{“max\u purchase\u date”:{“max”:{“field”:“purchases\u history.purchases.purchase\u date”}…
顺便说一句,我将更进一步,通过bucket选择器为
max\u purchase\u date
使用管道过滤器。有没有机会获得有关日期过滤器的帮助(当然是在另一个线程中,或者补充/更新当前的问题)?它已经在运行主脚本了,但是我非常确定
max\u purchase\u date
的内部类型与
date().getTime()
不同。(实际上我不是一个程序员或是一个非常专业的人。我只是需要让这个东西工作起来,但我基本上不知道我不知道什么)。对不起。没问题。我建议您为此创建另一个问题。再次感谢您。我刚刚按照建议创建了一个新问题。不确定这里是否是粘贴它的最佳位置,但如果不是,我肯定会删除它。