【问题标题】:How to compare two date fields in same document in elasticsearch如何在elasticsearch中比较同一文档中的两个日期字段
【发布时间】:2022-01-11 21:50:47
【问题描述】:

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

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

【问题讨论】:

  • 你运行的是哪个版本?

标签: elasticsearch kibana dsl elk


【解决方案1】:

有几个选项。

选项 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
}

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

选项 B:您可以使用script query

GET index/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": """
            return doc['createdDate'].value.millis < doc['modifiedDate'].value.millis;
          """
        }
      }
    }
  }
}

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

选项 C:如果您使用的是 ES 7.11+,则可以直接从 Kibana Discover view 使用 runtime fields

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

emit(doc['modifiedDate'].value.millis - doc['createdDate'].value.millis)

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

diffMillis > 0

【讨论】:

  • 我正在使用版本 7.10.2,我正在尝试将其用作 dsl 进行 kibana 可视化.. 第二种方法是抛出此错误 class_cast_exception: Cannot apply [
  • 我已更新选项 B 中的脚本,请重试
  • 条件被选择为大于等于而不是大于.. 我在无痛类型查询中遇到的同样问题。更新了问题。它在输出中给出所有记录
  • 你能出示一份你认为两个日期相等但不相等的文件吗?
  • 为了获得准确的点击次数,您需要在查询中添加"track_total_hits": true
猜你喜欢
  • 2021-06-14
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多