gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:55:05 25 4
gpt4 key购买 nike

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

假设这是文档:

{
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 过滤器(除此之外我还有其他过滤器)但它不起作用,类似于

"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" } }}
}

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

   "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 query :

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

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

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

关于Elasticsearch bool过滤器用于数组同一元素上的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com