【发布时间】:2015-11-25 19:06:06
【问题描述】:
我的团队拥有多个仪表板,并且正在考虑迁移到 Elasticsearch 以整合软件堆栈的可能性。我们公开的一种常见图表类似于“每天结束时待处理的工作流程是什么?”。以下是一些示例数据:
day workflow_id version status
20151101 1 1 In Progress
20151101 2 1 In Progress
20151102 1 2 In Progress
20151102 3 1 In Progress
20151102 4 1 In Progress
20151102 2 2 Completed
20151103 1 3 Completed
20151103 3 2 In Progress
20151104 3 3 Completed
20151105 4 2 Completed
每当工作流程中发生更改时,都会插入一条新记录,这可能会也可能不会更改状态。具有 max(version) 的记录是 workflow_id 的最新数据。
我们的目标是制作一个图表来显示每天结束时“进行中”和“已完成”工作流的总数。这应该只考虑到当天版本号最大的记录。这可以通过嵌套查询在 SQL 中完成:
with
snapshot_dates as
(select distinct day from workflow),
snapshot as
(select d.day, w.workflow_id, max(w.version) as max_version
from snapshot_dates d, workflow w
where d.day >= w.day
group by d.day, w.workflow_id
order by d.day, w.workflow_id)
select s.day, w.status, count(1)
from workflow w join snapshot s on w.workflow_id=s.workflow_id and w.version = s.max_version
group by s.day, w.status
order by s.day, w.status;
这是查询的预期输出:
day,status,count
20151101,In Progress,2
20151102,Completed,1
20151102,In Progress,3
20151103,Completed,2
20151103,In Progress,2
20151104,Completed,3
20151104,In Progress,1
20151105,Completed,4
我还是 Elasticsearch 的新手,想知道 Elasticsearch 是否可以在不使用应用程序端逻辑的情况下通过正确定义映射和查询来执行类似的查询。更一般地说,使用 Elasticsearch 解决此类问题的最佳实践是什么?
【问题讨论】:
-
您应该使用基于日期的聚合。你可以查看elastic.co/guide/en/elasticsearch/reference/current/…这个链接。
-
您应该将数据传输到 elasticsearch。如果您有结构化数据,则可以创建映射,查询非常容易。如果相同的数据具有不同的类型,有时弹性搜索查询会崩溃。
-
这里的难点是每天每个工作流程都不会有记录。例如,在 20151104 上,没有工作流 id 4 的记录,它应该使用 20151102 上的记录,因为那是当时最新的版本。但是对于 20151105,应该使用版本 2 的 20151105 上的记录。
-
我没有完全理解。我试图解释。创建日期字段。添加记录及其日期并收集大量数据。并首先聚合您的数据,然后使用工作流聚合聚合数据。或完全相反。在该聚合日期之后首先聚合工作流。您可以为此使用嵌套聚合。抱歉链接是假的。我在一分钟内改变它。
-
再次抱歉。我使用了错误的术语。
Subaggregation是正确的。您可以找到有关 elastic.co/blog/intro-to-aggregations-pt-2-sub-aggregations 嵌套聚合用于嵌套文档的信息。我的错。
标签: elasticsearch