如何在elasticsearch中比较同一文档中的两个日期字段

Man*_*mar 1 dsl elasticsearch kibana elk

在我的弹性搜索索引中,每个文档将有两个日期字段createdDatemodifiedDatemodifiedDate我正在尝试在 kibana 中添加一个过滤器来获取大于 的文档createdDate。如何在 kibana 中创建这个过滤器?
尝试使用下面的查询而不是大于它被视为 gte 并获取所有记录

GET index/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script" : {
                        "inline" : "doc['modifiedTime'].value.getMillis() > doc['createdTime'].value.getMillis()",
                        "lang"   : "painless"
                        }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 7

有几种选择。

选项 A:最简单且性能最高的一种是将两个字段的差异存储在文档的新字段中,例如

{
   "createDate": "2022-01-11T12:34:56Z",
   "modifiedDate": "2022-01-11T12:34:56Z",
   "diffMillis": 0
}
{
   "createDate": "2022-01-11T12:34:56Z",
   "modifiedDate": "2022-01-11T12:35:58",
   "diffMillis": 62000
}
Run Code Online (Sandbox Code Playgroud)

然后,在 Kibana 中,您可以查询diffMillis > 0并找出创建后修改过的所有文档。

选项 B:您可以使用script查询

GET index/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": """
            return doc['createdDate'].value.millis < doc['modifiedDate'].value.millis;
          """
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:根据您拥有的数据量,此选项可能会产生灾难性的性能,因为它需要对您的所有文档进行评估。

选项 C:如果您使用 ES 7.11+,则可以直接从Kibana Discover 视图使用运行时字段

您可以使用以下脚本将新的运行时字段(例如命名为 it diffMillis)添加到索引模式中:

emit(doc['modifiedDate'].value.millis - doc['createdDate'].value.millis)
Run Code Online (Sandbox Code Playgroud)

然后您可以将以下查询添加到搜索栏中

diffMillis > 0
Run Code Online (Sandbox Code Playgroud)

  • 为了获得准确的点击次数,您需要在查询中添加 `"track_total_hits": true` (2认同)