假设我的月度索引包含两个对筛选文档很重要的字段: client_id和date_time,以及其他几个我对这个查询不感兴趣的数据字段。
如果我想在索引中找到在一定时期内存在的所有不同的date_time (也就是说,如果它是订单,将是该期间登记的订单的所有日期,如果是租用的汽车,则是所有有租用汽车的天数,等等)
假设我想寻找2018-10-01和2018-10-03在ES中存在的不同的dateTime (本例简称)。
我可以从添加bool查询开始,将这些数据限制在日期范围内:
{
"size" : 0,
"timeout" : 1500,
"query" : {
"bool" : {
"must" : {
"range" : {
"date_time" : {
"from" : "2018-10-01T00:00:00.000Z",
"to" : "2018-10-03T23:59:59.999Z",
"include_lower" : true,
"include_upper" : true
}
}
}
}
}
} 我想通过文档进行日期范围聚合和筛选,计算代码:
{
"size" : 0,
"timeout" : 1500,
"query" : {
"bool" : {
"must" : {
"range" : {
"date_time" : {
"from" : "2018-09-19T00:00:00.000Z",
"to" : "2018-10-19T23:59:59.999Z",
"include_lower" : true,
"include_upper" : true
}
}
}
}
},
"aggregations" : {
"date_range_agg" : {
"date_range" : {
"field" : "date_time",
"ranges" : [ {
"from" : "2018-09-30T00:00:00.000Z",
"to" : "2018-10-01T00:00:00.000Z"
}, {
"from" : "2018-10-01T00:00:00.000Z",
"to" : "2018-10-02T00:00:00.000Z"
}, {
"from" : "2018-10-02T00:00:00.000Z",
"to" : "2018-10-03T00:00:00.000Z"
}, {
"from" : "2018-10-03T00:00:00.000Z",
"to" : "2018-10-04T00:00:00.000Z"
}]
}
}
}
} 我可以在代码中使用date_range_agg > 0过滤doc_count中的桶,但我仍然不喜欢它。
有没有一种方法可以在date_range桶上应用一个过滤器来只带那些包含超过0 doc计数的桶?
是否有另一种方法来执行"sql“(如date_time字段的agg ),以便在ES中为日期范围获得所有不同的数据?
简而言之,我只需要得到所有在给定时间内都有文档的不同的。
我们讨论的是7GB的文档索引(每个索引大约有160万个文档),或者是3.8GB的索引和200万个文档的索引。所以我想找出最具表现力的方法来找回这个。
添加-注意:实际上,这个查询用于验证我们所有索引中每天存在的数据,其中一些非常小,有些非常大,并且可以超时,所有这些索引都有一个dateTime字段,它们都具有对应于millis的第0天的时间戳和相同的时区,因此它们不会在毫秒或任何情况下发生变化。
发布于 2018-10-20 11:30:36
我认为下面的查询是您正在寻找的。我使用range part实现了aggregation的日期直方图,并使用了桶选择器聚合,这样只有那些具有document count>0的范围才会被返回。
{
"size":0,
"timeout":"1500ms",
"query":{
"bool":{
"must":{
"range":{
"date_time":{
"from":"2018-09-19T00:00:00.000Z",
"to":"2018-10-19T23:59:59.999Z",
"include_lower":true,
"include_upper":true
}
}
}
}
},
"aggregations":{
"date_range_agg":{
"date_histogram":{
"field":"date_time",
"format":"MM-dd-yyyy",
"interval":"week"
},
"aggs":{
"count_bucket_selector":{
"bucket_selector":{
"buckets_path":{
"count":"_count"
},
"script":{
"lang":"expression",
"inline":"count>0"
}
}
}
}
}
}
}因此,上面的查询将返回周列表以及该周的文档计数。如果那个星期没有任何文件,它就不会显示那一周。
您可以在上面的查询中使用month或day而不是week,如果您想分别查看每月或每天的详细信息的话。
性能
我建议您不要指定timeout,而是使用侧写特性,让您了解完成聚合查询所需的时间。
下面是如何向查询中添加分析参数的方法。
{
"profile": true,
"size": 0,
"query": {}
}添加以下内容时,您将能够在响应中查看带有profile的单独JSON对象。作为响应,您将能够查看每个碎片的查询性能细节。特别是查看aggregation部分,您可以进一步参考这个链接来了解更多关于定时故障的信息。
希望能帮上忙!
发布于 2018-10-20 07:46:04
在datetype.keyword上使用术语聚合的日期范围查询应该将唯一日期作为桶ids返回。
https://stackoverflow.com/questions/52899742
复制相似问题