gpt4 book ai didi

elasticsearch - Elasticsearch查询帮助-多个嵌套的AND/OR

转载 作者:行者123 更新时间:2023-12-03 01:04:18 28 4
gpt4 key购买 nike

我正在努力使用Elasticsearch过滤器。我有一个company_office类型,看起来像这样:

{
"company_office_id": 1,
"is_headquarters": true,
"company": {
"name": "Some Company Inc"
},
"attribute_values": [
{
"attribute_id": 1,
"attribute_value": "attribute 1 value",
},
{
"attribute_id": 2,
"attribute_value": "ABC",
},
{
"attribute_id": 3,
"attribute_value": "DEF",
},
{
"attribute_id": 3,
"attribute_value": "HIJ",
}
]
}

假设未对attribute_value进行分析-因此我可以对其进行精确匹配。

现在,我想对多个attribute_id和value字段的组合进行过滤。在SQL中是这样的:
SELECT *
FROM CompanyOffice c
JOIN Attributes a --omitting the ON here, just assume the join is valid
WHERE
c.is_headquarters = true AND
(
(a.attribute_id=2 AND a.attribute_value IN ('ABC')) OR
(a.attribute_id=3 AND a.attribute_value IN ('DEF','HIJ'))
)

所以我需要过滤特定字段+ id / value的多个组合。

这是我尝试过的查询:
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [


{ "term": {"is_headquarters": true } },
{"bool": {
"must":[
{"term": {"attribute_values.attribute_id": 1}},
{"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}}
]
}}
]
}
}
}
}
}

即使company_office没有1 /'HIJ'的ID /值对,此查询也会返回结果。我的想法是,由于此 bool(boolean) 过滤器位于父 must节的内部,因此所有项目都必须为true:
            {"bool": { 
"must":[
{"term": {"attribute_values.attribute_id": 1}},
{"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}}
]
}}

给定问题开头提供的数据样本,为什么该查询返回结果?有没有其他方法可以编写过滤器并完成我要尝试的操作?

非常感谢您的帮助!

最佳答案

如果要查询更深的对象而不展平其结构,则需要设置

"type": "nested"

"attribute_values"属性上。

然后引用如何编写 nested queries in documentation,您应该正确检索整个文档。使用 inner hits检索匹配的 attribute_values

默认情况下,Elasticsearch在索引时不嵌套属性。所有子字段都被压缩为单独的子字段,而无法按其实际结构进行查询。您不会看到这种效果,因为返回了原始文档。

除此之外,您的查询还有点不足。在最后一个 "should"语句中,您只有1个术语过滤器,因此它实际上是 "must"的一部分,但是必须将它们重写为嵌套格式。

关于elasticsearch - Elasticsearch查询帮助-多个嵌套的AND/OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32790676/

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