首页 > 解决方案 > 如何在elasticsearch中查询数组内的空日期?

问题描述

在弹性搜索查询中,我试图搜索具有一系列批准通知的 Document 对象。dateCompleted当用日期填充时,通知被认为是完整的,当dateCompleted不存在或存在时被认为是待处理的null。如果文档不包含一系列批准通知,则它不在搜索范围内。

我知道放置null_value字段dateCompleted并将其设置为任意旧日期,但这对我来说似乎很骇人听闻。

我尝试使用 Bool 查询,must exist doc.approvalNotifications and must not exist doc.approvalNotifications.dateCompleted但如果文档包含完整和待处理的approvalNotifications,则它不起作用。例如,它只返回下面 ID 为 2 的文档。我期待找到 ID 为 1 和 2 的文档。

如何使用 elasticsearch 查找待批准的通知?

PUT my_index/_mapping/文档

 "properties" : {
  "doc" : {
    "properties" : {
      "approvalNotifications" : {
        "properties" : {
          "approvalBatchId" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "approvalTransitionState" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "approvedByUser" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "dateCompleted" : {
            "type" : "date"
          }
        }
      }
    }
  }
}

文件:

{
    "id": 1,
    "status": "Pending Notifications",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
            "dateCompleted": "2018-11-15T16:09:15.346+0000"
        },
        {
            "approvalBatchId": "05eaeb5d-d802-4a28-b699-5e593a59d445",
        }
    ]
}

{
    "id": 2,
    "status": "Pending Notifications",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
        }
    ]
}

{
    "id": 3,
    "status": "Complete",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
            "dateCompleted": "2018-11-15T16:09:15.346+0000"
        },
        {
            "approvalBatchId": "05eaeb5d-d802-4a28-b699-5e593a59d445",
            "dateCompleted": "2018-11-16T16:09:15.346+0000"            
        }
    ]
}

{
    "id": 4
    "status": "No Notifications"
}

标签: elasticsearch

解决方案


您快到了,您可以通过使用字段的nested数据类型来实现所需的行为"approvalNotifications"

发生的情况是 Elasticsearch 将您的approvalNotifications对象展平,将它们的子字段视为原始文档的子字段。相反,该nested字段将告诉 ES 将每个内部对象索引为隐式单独对象,尽管与原始对象相关。

要查询nested对象,应该使用nestedquery

希望有帮助!


推荐阅读