我正在汇总每个都有时间戳的文档.时间戳是UTC,但每个文档也有一个本地时区("timezone": "America/Los_Angeles"),可以在文档之间有所不同.
我正在尝试date_histogram aggregation基于当地时间而不是UTC或固定时区(例如,使用该选项"time_zone": "America/Los_Angeles").
如何在聚合之前将每个文档的时区转换为当地时间?
这是简单的聚合:
{
"aggs": {
"date": {
"date_histogram": {
"field": "created_timestamp",
"interval": "day"
}
}
}
}
Run Code Online (Sandbox Code Playgroud) timezone elasticsearch date-histogram elasticsearch-aggregation
我在ElasticSearch中有一堆索引的文档,我需要获取以下数据:
对于每个月,获取当月每个工作日的平均文档数(或者如果不可能,则使用20天作为默认值).
我已经使用聚合将我的数据汇总到了几个桶中date histogram.我尝试嵌套stats存储桶,但此聚合使用从文档字段中提取的数据,而不是从父存储桶中提取的数据.
这是我目前的查询:
{
"query": {
"match_all": {}
},
"aggs": {
"docs_per_month": {
"date_histogram": {
"field": "created_date",
"interval": "month",
"min_doc_count": 0
}
"aggs": {
'???': '???'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
为了使我的问题更清楚,我需要的是:
date_histogram聚合已经完成)为了实现表示唯一访问者指标总数的日期直方图,查询 Elasticsearch 的最佳方法是什么?
考虑以下数据:
PUT /events
{
"mappings" : {
"_doc" : {
"properties" : {
"userId" : { "type" : "keyword" },
"eventDate" : { "type" : "date" }
}
}
}
}
POST /events/_bulk
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "1" } }
{"userId": "1","eventDate": "2019-03-04T13:40:18.514Z"}
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "2" } }
{"userId": "2","eventDate": "2019-03-04T13:46:18.514Z"}
{ "index" : { "_index" : "events", "_type" …Run Code Online (Sandbox Code Playgroud) 更新的问题
在我的查询中,我先聚合日期,然后聚合传感器名称。是否可以根据父存储桶的嵌套聚合和文档总数(或任何其他聚合)计算比率?查询示例:
{
"size": 0,
"aggs": {
"over_time": {
"aggs": {
"by_date": {
"date_histogram": {
"field": "date",
"interval": "1d",
"min_doc_count": 0
},
"aggs": {
"measure_count": {
"cardinality": {
"field": "date"
}
},
"all_count": {
"value_count": {
"field": "name"
}
},
"by_name": {
"terms": {
"field": "name",
"size": 0
},
"aggs": {
"count_by_name": {
"value_count": {
"field": "name"
}
},
"my ratio": count_by_name / all_count * 100 <-- How to do that?
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要一个自定义指标,它可以给出count_by_name …
我需要每 30 天(而不是每月)聚合一次数据,因此我使用date_histogramwith"fixed_interval": "30d"来获取该数据。例如,如果用户想要最近 90 天的聚合,则应该有 3 个存储桶:[90-60, 60-30, 30-0]。以今天的日期(2021 年 3 月 18 日)为例,我想要桶 [12 月 18 日、1 月 17 日、2 月 16 日]。
然而,我实际得到的是[12月4日,1月3日,2月2日,3月4日]。第一个存储桶的启动时间早于任何可用数据,这也意味着最终需要比预期更多的存储桶。
我发现您无法轻易判断您的存储桶何时开始(例如,我希望我的第一个存储桶在今天 - 90 天开始)。根据我能找到的内容(例如this ) ,桶似乎从 1970-01-01 开始,文档也有点这样说(这个链接,尽管它没有深入影响影响)。
考虑到这一点,我发现我可以使用offset一个“有趣的公式”,这样我就能得到我需要的正确的桶。例如:
GET /my_index/_search?filter_path=aggregations
{
"size": 0,
"query": {
"bool": {
"must": [
{ "range" : {
"@timestamp" : {
"gte" : "TODAY - 90/60/30",
"lt" : "TODAY"
}}
}
]
}
},
"aggs": {
"discussion_interactions_chart": {
"date_histogram": …Run Code Online (Sandbox Code Playgroud) 我想在特定时间段内获取 date_histogram,如何限制日期时间段?我应该使用extended_bounds 参数吗?例如:我想查询'2016-08-01'和'2016-08-31'之间的date_histogram,间隔为天。我用这个表达式查询:
{
"aggs": {
"cf_loan": {
"date_histogram": {
"field": "createDate",
"interval": "day",
"format": "yyyy-MM-dd",
"min_doc_count": 0,
"extended_bounds": {
"min": "2016-08-01",
"max": "2016-08-31"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我得到的 date_histogram 不在范围内。
我正在使用 Elasticsearch 2.3,对于用户在我的网站中访问的每个网页,我都会生成一条包含用户会话 ID 和当前时间戳的记录。
所以我有一些具有相同会话 ID 但不同时间戳的记录。
我正在尝试从用户记录中创建一个date_histogram具有唯一会话 ID 的会话。
创建没有唯一性的直方图很容易:
{
"aggs" : {
"users_sessions" : {
"date_histogram" : {
"field" : "date",
"interval" : "1h"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是是否有可能拥有具有唯一值的日期直方图(例如,每个唯一会话 ID 的第一次出现)?
我使用 Postgres CLI 编写了一个查询,该查询在终端中返回条形图。查询速度慢且效率低。我想改变这一点。
在底层,我们有一个非常简单的查询。我们希望每一行都是表中总行数的除法。假设我们的硬编码行数是N_ROWS,我们的表是my_table。
另外,假设N_ROWS等于 8。
select
(select count(id) from my_table) / N_ROWS * (N_ROWS - num) as level
from (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8)) as t (num)
Run Code Online (Sandbox Code Playgroud)
就我而言,这将返回图表的 Y 轴:
level
-------
71760
62790
53820
44850
35880
26910
17940
8970
0
Run Code Online (Sandbox Code Playgroud)
您已经可以看到该查询的问题。
我可以使用编程方式生成多行N_ROWS而不是对每个行值进行硬编码吗VALUES?显然,我也不喜欢对整个表的每一行执行新的计数。
我们现在需要 X 轴,这就是我的想法:
select
r.level,
case
when (
select count(id) from my_table where created_at_utc<= '2019-01-01 00:00:00'::timestamp without time zone
) …Run Code Online (Sandbox Code Playgroud)