Elasticsearch bool 过滤器用于数组同一元素上的多个条件

2024-04-11

我正在尝试创建一个仅在满足多个条件时才匹配文档的查询/过滤器在同一个项目上一个数组的。

假设这是文档:

{
  arr: [
    { "f1" : "a" , f2 : true },
    { "f1" : "b" , f2 : false}
  ]
}

我希望能够检索在同一元素上有 N 个条件匹配的文档。例如:arr.f1 == "a" AND arr.f2 == true应该与文档匹配,但是arr.f1 == "b" AND arr.f2 == true不应该。

我正在尝试嵌套布尔过滤器(除了这个过滤器之外我还有其他过滤器)但它不起作用,类似于

"bool" : {
    "must": [
        { some other filter },
        {"bool": {"must" : [
            {"term" : {"arr.f1" : "a"}},
            {"term" : {"arr.f2" : true}},
        ] }}
    ]
}

知道该怎么做吗? 谢谢

edit: 我更改了映射,现在嵌套查询按照 Val 的响应工作。我现在无法对嵌套字段执行“存在”过滤器:

一个简单的{ "filter" : {"exists" : { "field" : "arr" } } }搜索未返回任何结果。我怎么做?

编辑:看起来我需要执行嵌套存在过滤器来检查嵌套对象内的字段是否存在。 就像是:

"filter" : {
       "nested" : {"path" : "arr", "filter" : {"exists" : { "field" : "f1" } }}
}

编辑: 啊 - 现在突出显示不再起作用:

   "highlight" : {
        "fields" : [
            {"arr.f1" : {}},
        ]
    }

通过添加解决了这个问题include_in_parent : true并查询嵌套字段和根对象。这太糟糕了。如果有人有更好的想法,我们非常欢迎!

{   
    "query" : {
        "bool" : {
            "must": [
                {"term" : { "arr.f1" : "a" }},
                { "nested" : { "path" : "arr", 
                   "query" :  { "bool" : { "must" : [ 
                        {"term" : { "arr.f1" : "a" }},
                        {"term" : { "arr.f2" : true }}
                   ] } } 
                }}
            ]
        }
    },
    "highlight" : {
        "fields" : [
            {"arr.f1" : {}},
        ]
    }
}

如果您想知道:这是遗留的东西。我现在无法重新索引(这将是显而易见的解决方案),我需要一个快速而肮脏的解决方法


您需要设置您的类型arr字段为nested https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-nested-type.html像这样:

{
    "your_type": {
        "properties": {
            "arr": {
                "type": "nested",
                "properties": {
                    "f1": {"type":"string"},
                    "f2": {"type":"boolean"}
                }
            }
        }
    }
}

然后你需要使用一个nested query https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html:

{
    "nested" : {
        "path" : "arr",
        "query" : {
            "bool" : {
                "must" : [
                    {
                        "term" : {"arr.f1" : "a"}
                    },
                    {
                        "term" : {"arr.f2" : true}
                    }
                ]
            }
        }
    }
}

Your exists过滤器需要指定完整的字段路径

"filter" : {
       "nested" : {"path" : "arr", "filter" : {"exists" : { "field" : "arr.f1" } }}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch bool 过滤器用于数组同一元素上的多个条件 的相关文章

随机推荐