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()
不同。(实际上我不是一个程序员或是一个非常专业的人。我只是需要让这个东西工作起来,但我基本上不知道我不知道什么)。对不起。没问题。我建议您为此创建另一个问题。再次感谢您。我刚刚按照建议创建了一个新问题。不确定这里是否是粘贴它的最佳位置,但如果不是,我肯定会删除它。