我有数以百万计的文件,像这样的块:
{
"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"
}
]
}
}
我想弄清楚我怎样才能做到这样:
SELECT useraccountid, max(purchases_history.purchases.purchase_date) FROM my_index GROUP BY useraccountid
我只找到了最大聚合,但它聚集在索引中的所有文档上,但这不是我所需要的。我需要找到每个文件的最大购买日期。我相信必须有一种方法来迭代每个文档的每个路径purchases_history.purchases.purchase_date,以确定哪一个是最大购买日期,但我真的找不出怎么做(当然,这是最好的方法)。
有什么建议吗?
发布于 2019-09-02 14:15:22
我假设您的字段useraccountid
是唯一的。你必须做一个术语聚合,在里面做最大聚合。我可以这样想:
"aggs":{
"unique_user_ids":{
"terms":{
"field": "useraccountid",
"size": 10000 #Default value is 10
},
"aggs":{
"max_date":{
"max":{
"field": "purchases_history.purchases.purchase_date"
}
}
}
}
}
在aggregations
字段中,您将首先看到唯一的用户ID和内部,以及它们的最大日期。
请注意10,000的大小。建议只在10,000个结果之前返回terms
聚合。
如果你需要更多,你可以玩复合聚集。这样,您可以对结果进行分页,您的集群将不会出现性能问题。
如果您想玩复合游戏,我可以想到以下几点:
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" } } }
]
}
}
}
}
运行查询后,它将返回一个名为after_key
的字段。使用该字段,您可以在包含10,000个元素的页面中对结果进行分页。看一看复合聚集的后置参数。
希望这能帮上忙!
https://stackoverflow.com/questions/57762494
复制相似问题