在Elasticsearch查询中,我试图搜索具有批准通知数组的Document对象。当dateCompleted
填充日期时,通知被认为是完整的,而dateCompleted
不存在或存在null
时,通知被认为是待处理的。如果该文档不包含批准通知数组,则它不在搜索范围内。
我知道要在字段null_value
中放置dateCompleted
并将其设置为某个任意的旧日期,但这对我来说似乎有点荒谬。
我尝试将Bool查询与must exist doc.approvalNotifications and must not exist doc.approvalNotifications.dateCompleted
一起使用,但是如果文档包含完整的和未决的rovalNotifications,则无法使用。例如它仅返回下面ID为2的文档。我希望找到ID为1和2的文档。
如何使用Elasticsearch查找待批准的通知?
输入my_index / _mapping / Document
"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"
}
答案 0 :(得分:0)
您快到了,可以通过将"approvalNotifications"
字段使用nested
数据类型来实现所需的行为。
发生的事情是,Elasticsearch展平了您的approvalNotifications
对象,将它们的子字段视为原始文档的子字段。 nested
字段将告诉ES将每个内部对象索引为一个隐式的独立对象,尽管与原始对象相关。
要查询nested
个对象,应使用nested
query。
希望有帮助!