elasticsearch,nested-queries,Filter,elasticsearch,Nested Queries" /> elasticsearch,nested-queries,Filter,elasticsearch,Nested Queries" />

Filter 弹性搜索-按最新日期筛选值

Filter 弹性搜索-按最新日期筛选值,filter,elasticsearch,nested-queries,Filter,elasticsearch,Nested Queries,在弹性搜索中,我们有一个具有不同值的文档。每个值都有一个句点。句点表示该值是否仍然是实际值,并表示该值在哪个时段是实际值 示例如下: "": [ { "memberType": user, "period": { "validFrom": "1964-08-23", "validTo": "2008-12-31" }, }, { "memberType": admin, "period": { "validFrom": "2008-12-31",

在弹性搜索中,我们有一个具有不同值的文档。每个值都有一个句点。句点表示该值是否仍然是实际值,并表示该值在哪个时段是实际值

示例如下:

"": [
{
  "memberType": user,
  "period": {
    "validFrom": "1964-08-23",
    "validTo": "2008-12-31"
  },
},
{
  "memberType": admin,
  "period": {
    "validFrom": "2008-12-31",
    "validTo": null
  } 
}
]
在我们的查询中,我想按memberType进行筛选。但只处理最新类型的成员。因此,如果我按memberType用户筛选,则上面的文档不应匹配,因为实际的memberType是admin

在上面的示例中,我可以通过memberType和validTo字段上的missing字段使用布尔过滤器进行过滤

但是,如果此人的有效期不再有效,则两者都将定义一个validTo日期,然后我必须查看最新的日期

我怎样才能做到这一点?我想使用嵌套查询或自定义脚本过滤器。但是我不知道如何表达这个疑问


提前感谢

如果此数组的字段名是memberDetails,您可以使用此查询来实现所需的功能

{
    "query" : { "match_all" : {} },
    "filter" : {
        "nested" : {
            "path" : "memberDetails",
            "filter" : {
                "bool" : {
                    "must" : [
                        {
                            "term" : {"memberType" : "user"}
                        },
                        {
                            "missing" : { "field" : "validTo" }
                        }
                    ]
                }
            }
        }
    }
}

谢谢Vishal。但你的答案并不完整。如果缺少validTo字段,则给出的示例仅返回。但并非所有情况下都缺少该字段,在某些情况下,validTo将有一个日期值,我需要找到最新的日期。示例:[{memberType:user,句点:{validFrom:1964-08-23,validTo:2008-12-31},},{memberType:admin,句点:{validFrom:2008-12-31,validTo:2012-04-30}]