首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticSearch:在包含文档的日期范围中查找不同日期的最佳方法是什么?

ElasticSearch:在包含文档的日期范围中查找不同日期的最佳方法是什么?
EN

Stack Overflow用户
提问于 2018-10-19 20:50:44
回答 2查看 537关注 0票数 1

假设我的月度索引包含两个对筛选文档很重要的字段: client_id和date_time,以及其他几个我对这个查询不感兴趣的数据字段。

如果我想在索引中找到在一定时期内存在的所有不同的date_time (也就是说,如果它是订单,将是该期间登记的订单的所有日期,如果是租用的汽车,则是所有有租用汽车的天数,等等)

假设我想寻找2018-10-01和2018-10-03在ES中存在的不同的dateTime (本例简称)。

我可以从添加bool查询开始,将这些数据限制在日期范围内:

代码语言:javascript
复制
{
  "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
          }
        }
      }
    }
  }
} 

我想通过文档进行日期范围聚合和筛选,计算代码:

代码语言:javascript
复制
{
  "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天的时间戳和相同的时区,因此它们不会在毫秒或任何情况下发生变化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-20 11:30:36

我认为下面的查询是您正在寻找的。我使用range part实现了aggregation日期直方图,并使用了桶选择器聚合,这样只有那些具有document count>0的范围才会被返回。

代码语言:javascript
复制
{  
   "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"
                  }
               }
            }
         }
      }
   }
}

因此,上面的查询将返回周列表以及该周的文档计数。如果那个星期没有任何文件,它就不会显示那一周。

您可以在上面的查询中使用monthday而不是week,如果您想分别查看每月或每天的详细信息的话。

性能

我建议您不要指定timeout,而是使用侧写特性,让您了解完成聚合查询所需的时间。

下面是如何向查询中添加分析参数的方法。

代码语言:javascript
复制
{
    "profile": true,
    "size": 0,
    "query": {}
}

添加以下内容时,您将能够在响应中查看带有profile的单独JSON对象。作为响应,您将能够查看每个碎片的查询性能细节。特别是查看aggregation部分,您可以进一步参考这个链接来了解更多关于定时故障的信息。

希望能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2018-10-20 07:46:04

在datetype.keyword上使用术语聚合的日期范围查询应该将唯一日期作为桶ids返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52899742

复制
相关文章

相似问题

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