我有一个非常常见的问题,我需要显示哪些用户或文档类别,所有这些都由 keyword
列,它们在给定的时间间隔内不存在。我默认使用术语聚合,这显然不会为丢失的条目返回任何内容。
在关系数据库中,这是一个非常简单的问题,只需从用户表执行外部联接即可。在kibana/elasticsearch中,我不知道如何解决这个问题。
一种可行的方法是切换到filter,然后将所有用户复制并粘贴到各个filter规范中。但是,它不能被维护,并且不能与多个报告一起扩展。
我可以为每个术语提供一个示例文档,即使它只是一个伪文档。在kibana auto complete中选择项目时,这将显示所有项目,等等。如果我可以得到结果,使每个项目始终包含至少一个bucket,那么问题就解决了。
例如,kibana y轴是一个简单的计数,而x轴应该显示最少条目的用户。报告设置为显示时段2的数据:
User | Period 1 | Period 2 |
MR_X | o o o o o o | o o o o |
MISS_Y | o o o | o |
MR_Z | o o o | |
MISS_W | | |
在本例中,时段2的报告应至少显示miss_y和mr_z,因为它们在数据集中是已知的,并且在时段2中具有最少的条目。以某种方式包含数据集中没有任何条目的miss_w将是一种奖励。
1条答案
按热度按时间vu8f3i0k1#
如果我误解了你的问题,请提前道歉。聚合提供了一种获取结果集中文档的不同分布的方法。如果您希望为不同的时间间隔使用不同的聚合,则需要查询返回所有时间间隔的结果,并且需要在每个聚合中按不同的时间间隔进行筛选。
例如,如果您具有以下条件:
一个叫做
timestamp
用于指定时间间隔的一个叫做
user
你想聚集在一起你的报告的时间框架(也就是你问题的第二个句点)是最后1小时
第一阶段是最后一个小时之前的一切
然后您可以尝试按如下方式构造elasticsearch查询
重申一下,如果你现在有
query
在你的aggs
块,则需要从中删除任何子句query
指定时间间隔的。诚然,这是对您的查询的一个非常侵入性的更改,我很感激它可能会打破您的另一个要求。在这种情况下,您将需要采取不同的方法,但elasticsearch相当灵活,有望为您提供一种获取所需内容的方法。