选定时间范围内不存在的“术语”的存储桶

ep6jt1vc  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(215)

我有一个非常常见的问题,我需要显示哪些用户或文档类别,所有这些都由 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将是一种奖励。

vu8f3i0k

vu8f3i0k1#

如果我误解了你的问题,请提前道歉。聚合提供了一种获取结果集中文档的不同分布的方法。如果您希望为不同的时间间隔使用不同的聚合,则需要查询返回所有时间间隔的结果,并且需要在每个聚合中按不同的时间间隔进行筛选。
例如,如果您具有以下条件:
一个叫做 timestamp 用于指定时间间隔的
一个叫做 user 你想聚集在一起
你的报告的时间框架(也就是你问题的第二个句点)是最后1小时
第一阶段是最后一个小时之前的一切
然后您可以尝试按如下方式构造elasticsearch查询

GET myindex/_search
{
  ...
  "aggs": {
    "period-2-distribution": {
      "filter": {
        "range": {
          "timestamp": {
            "gte": "now-1h"
          }
        }
      }, 
      "aggs": {
        "user-agg": {
          "terms": {
            "field": "user",
            "size": 1000
          }
        }
      }
    },
    "period-1-distribution": {
      "filter": {
        "range": {
          "timestamp": {
            "lt": "now-1h"
          }
        }
      }, 
      "aggs": {
        "user-agg": {
          "terms": {
            "field": "user",
            "size": 1000
          }
        }
      }
    }    
  }
}

重申一下,如果你现在有 query 在你的 aggs 块,则需要从中删除任何子句 query 指定时间间隔的。诚然,这是对您的查询的一个非常侵入性的更改,我很感激它可能会打破您的另一个要求。在这种情况下,您将需要采取不同的方法,但elasticsearch相当灵活,有望为您提供一种获取所需内容的方法。

相关问题