ElasticSearch按嵌套文档中的特定字段聚合,但不过滤掉它

zhte4eai  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(83)

文档(产品)结构如下:

{
                    "id": 112,
                    ....
                    "options": [
                        {
                            "in_stock": true,
                            "op_values": [
                                {
                                    "name": "Color",
                                    "value": "Red"
                                }
                            ],
                           ....
                        },
                        {
                            "in_stock": false,
                            "op_values": [
                                {
                                    "name": "Color",
                                    "value": "Blue"
                                }
                            ],
                           ....
                       }
}

字符串
我尝试聚合stock中的所有“op_values”,但是当我添加in_stock term时,它过滤了顶级文档,并且我在bucket中没有结果。
它只是一个大查询的一部分,以便更容易阅读:

.....  .....
 "aggs": {
                                    "filter": {
                                        "bool": {
                                            "should": [
                                                {
                                                    "term": {
                                                        "options.in_stock": {
                                                            "value": true,
                                                            "boost": 1
                                                        }
                                                    }
                                                },
                                                {
                                                    "term": {
                                                        "options.op_values.name": {
                                                            "value": "Color",
                                                            "boost": 1
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    },
                               
    }
....


假设我只有一个文档,具有不同的股票字段值,当我聚合时,我只需要看到股票:true值,但我看到两者或没有,取决于in_stock过滤器
内心的碰撞可能是解决方案吗?我不能使聚合与内部命中一起工作,我是不是在尝试做一些ES不可能做的事情?

8zzbczxx

8zzbczxx1#

查看嵌套对象。这将使您的选项成为elasticsearch中单独文档的列表,并允许执行此类操作。
https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html
https://linuxhint.com/elasticsearch-nested-query/

已更新:假设你有这样的数据

"options": [
        {
            "in_stock": "true",
            "op_values": [
                {
                    "name": "Color",
                    "value": "Pink"
                }
            ]
        },
        {
            "in_stock": "true",
            "op_values": [
                {
                    "name": "Color",
                    "value": "Red"
                },
                {
                    "name": "Color",
                    "value": "Black"
                }
            ]
        },
        {
            "in_stock": "false",
            "op_values": [
                {
                    "name": "Color",
                    "value": "Blue"
                }
            ]
        },

字符串
你想得到这样的结果。所以你有颜色,但只有库存。对吗?

为此,我使用了这个聚合。

{
"query": {
    "match_all": {}
},
"aggs": {
    "options": {
        "nested": {
            "path": "options"
        },
        "aggs": {
            "in_stock": {
                "filter": {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "options.in_stock": {
                                        "value": "true",
                                        "boost": 1
                                    }
                                }
                            }
                        ]
                    }
                },
                "aggs": {
                    "op_values": {
                        "nested": {
                            "path": "options.op_values"
                        },
                        "aggs": {
                            "colors": {
                                "terms": {
                                    "field": "options.op_values.value"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
}


有点大:),但希望符合你的要求。

相关问题