当前位置: 首页 > 面试题库 >

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

谷梁嘉悦
2023-03-14
问题内容

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

假设这是文档:

{
  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}},
        ] }}
    ]
}

任何想法如何做到这一点?谢谢

编辑 :我更改了映射,现在嵌套查询根据Val的响应工作。我现在无法在嵌套字段上执行“存在”过滤器:

简单{ "filter" : {"exists" : { "field" : "arr" } } }搜索不会返回任何匹配。我怎么做?

编辑:看来我需要做一个嵌套的存在过滤器,以检查嵌套对象内的字段是否存在。就像是:

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

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

   "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

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

然后,您需要使用nested查询:

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

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

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


 类似资料:
  • 问题内容: 谁能向我解释为什么我对这两个表达式会得到不同的结果?我正在尝试在2个日期之间进行过滤: 结果:37M 与 结果:25M 它们有何不同?在我看来,他们应该产生相同的结果 问题答案: TL; DR 要传递多个条件或使用对象和逻辑运算符(,,)。请参见Pyspark:when子句中的多个条件。 您还可以使用 单个 SQL字符串: 实际上,在以下两者之间使用更有意义: 第一种方法甚至不是远程有

  • 问题内容: 我想了解 从另一个数组的所有元素过滤数组 的最佳方法。我尝试使用过滤器功能,但是如何给它提供要删除的值并没有解决。 就像是: 如果过滤器功能没有用,您将如何实现呢? 编辑:我检查了可能重复的问题,它可能对那些容易理解javascript的人有用。选中的答案很容易。 问题答案: 您可以使用函数的参数来避免将过滤器数组存储在全局变量中。

  • 问题内容: 我想删除原始数组(是)中的特定元素。我那个数组,并返回新的数组。但这不会影响此代码中的原始数组。我如何轻松地从原始数组中删除那些元素? 问题答案: 该方法不仅用于收集元素集,而且还用于收集元素集。如果您想通过评估条件来获得一项,那么您还有其他三种选择。,并因此只有当你想对多个项目的操作,你应该考虑使用过滤功能。就需要完成的工作而言,没有一个答案是完整的。他们使用过滤器功能隔离一个集合(

  • 我想要找到合适的正则表达式匹配的行数。输入是通过Java Stream插入的日志文件。我想对这个流应用多个过滤器,但每隔一段时间计算一次。

  • 用spring云网关构建新的API网关。目前经历以下挑战。

  • 我尝试根据过滤最后一个元素的过滤器引发异常: 这样我就可以分辨出为什么在人流中没有发现任何人。是因为年龄还是因为没有人养宠物。 我只看到一个选项,并用两个流来实现它? 或者我能做些什么来把所有的事情都集中在一个流里?