【问题标题】:Find sequences in time series data using Elasticsearch使用 Elasticsearch 在时间序列数据中查找序列
【发布时间】:2021-03-12 22:19:58
【问题描述】:

我正在尝试查找示例 Elasticsearch 查询以返回时间序列中的事件序列。我的数据集是每隔 10 分钟的降雨量值,我想查找所有风暴事件。风暴事件将被视为持续降雨超过 12 小时。这相当于 72 个连续记录的降雨量值大于零。我可以在代码中做到这一点,但要做到这一点,我必须翻阅数千条记录,所以我希望有一个基于查询的解决方案。下面是一个示例文档。

我在一个大学研究小组工作,因此任何涉及高级许可证的解决方案都可能由于预算问题而无法使用。

谢谢!

{
  "_index": "rabt-rainfall-2021.03.11",
  "_type": "_doc",
  "_id": "fS0EIngBfhLe-LSTQn4-",
  "_version": 1,
  "_score": null,
  "_source": {
    "@timestamp": "2021-03-11T16:00:07.637Z",
    "current-rain-total": 8.13,
    "rain-duration-in-mins": 10,
    "last-recorded-time": "2021-03-11 15:54:59",
    "rain-last-10-mins": 0,
    "type": "rainfall",
    "rain-rate-average": 0,
    "@version": "1"
  },
  "fields": {
    "@timestamp": [
      "2021-03-11T16:00:07.637Z"
    ]
  },
  "sort": [
    1615478407637
  ]
}

更新 1

感谢@Val,我当前的查询是

GET /rabt-rainfall-*/_eql/search
{
  "timestamp_field": "@timestamp",
  "event_category_field": "type",
  "size": 100,
  "query": """
    sequence
      [ rainfall where "rain-last-10-mins" > 0 ]
      [ rainfall where "rain-last-10-mins" > 0 ]
    until [ rainfall where "rain-last-10-mins" == 0 ]
  """
}

只有一个规则的序列查询会导致语法错误,从而导致重复。查询正在运行,但不返回任何文档。

更新 2

由于我没有正确转义属性名称,因此没有返回结果。但是,由于两个序列规则,我得到长度为 2 的匹配,而不是任意长度的匹配,直到满足停止子句。

GET /rabt-rainfall-*/_eql/search
{
  "timestamp_field": "@timestamp",
  "event_category_field": "type",
  "size": 100,
  "query": """
    sequence
      [ rainfall where `rain-last-10-mins` > 0 ]
      [ rainfall where `rain-last-10-mins` > 0 ]
    until [ rainfall where `rain-last-10-mins` == 0 ]
  """
}

【问题讨论】:

  • 您能否分享一份您的索引示例文档,以便我们了解可以使用的字段类型?
  • @Val 我已经用示例文档更新了问题

标签: elasticsearch time-series


【解决方案1】:

这绝对是EQL 的工作,它允许您返回相关数据序列(按时间排序并匹配一些约束):

GET /rabt-rainfall-2021.03.11/_eql/search?filter_path=-hits.events
{
  "timestamp_field": "@timestamp",
  "event_category_field": "type",
  "size": 100,
  "query": """
    sequence with maxspan=12h
      [ rainfall where `rain-last-10-mins` > 0 ]
    until `rain-last-10-mins` == 0
  """
}

上面的查询想要做的基本上是这样的:

  • 给我rainfall类型的事件序列
  • rain-last-10-mins > 0
  • 在 12 小时内发生
  • 直到 rain-last-10-mins 降至 0

until 语句确保一旦事件在给定时间窗口内具有rain-last-10-mins: 0,序列就会“过期”。

在响应中,您将在hits.total.value 中获得匹配事件的数量,如果该数字是 72(因为时间窗口限制为 12 小时),那么您知道您有一个匹配的序列。

所以你这里的“风暴”信号是检测上述查询是否返回hits.total.value: 72或更低。

免责声明:我没有对此进行测试,但理论上它应该按照我描述的方式工作。

【讨论】:

  • 感谢您的回答,我已添加更新以更清楚地查看当前查询
  • 有道理...如果您只使用以下内容运行查询 rainfall where "rain-last-10-mins" > 0 会得到什么?
  • 我也没有得到任何东西,然后我发现我需要用反引号而不是引号来转义属性名称。我现在得到了序列的结果,但是至少需要两个序列规则导致它只返回长度 == 2 的序列。我可以通过添加第三条规则来证明这一点,然后它匹配长度 == 的序列3. 我会用最新的查询更新帖子
  • 关于反勾号的好电话。如果您完全删除该序列并仅查询我上面建议的内容,您会得到什么?
  • 我得到一个事件数组,其中所有记录的降雨量都超过 0 分钟 10 分钟
猜你喜欢
  • 2019-06-24
  • 2022-06-13
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2013-10-18
相关资源
最近更新 更多