如何基于嵌套字段的聚合执行过滤器? (类似于嵌套排序)

问题描述 投票:0回答:1

我的索引如下:

cargroup

 "mappings": {
    "properties": {
      "id":     { "type": "integer" },
      "cars":   { "type": "nested",
                            "properties": {
                                    "brand": {
                                        "type": "keyword"
                                    },
                                    "value": {
                                        "type": "integer"
                                    }
                                }
                        },

我如何只获得价值总和> 100的'丰田'品牌的汽车集团? (价值总和仅在“丰田”品牌中计算)

例如给出以下文件:

[id: 1,
cars:[{
brand: toyota,
value: 30},
{
brand: toyota,
value: 30},
{
brand: honda,
value: 30}
],
id: 2,
cars:[{
brand: toyota,
value: 30},
{
brand: toyota,
value: 50},
{
brand: honda,
value: 30}
],
id: 1,
cars:[{
brand: toyota,
value: 30},
{
brand: toyota,
value: 80},
{
brand: honda,
value: 30}
]]

我只想获取3号文档,因为它的丰田汽车的总和是(80 + 30 = 110)大于100

我曾使用术语和过滤聚合将汽车组划分为“ id”存储桶,然后在每个存储桶上使用总和聚合。但是,我还没有找到一种将每个汽车组“链接”到其对应的存储桶以进行后续过滤的方法。

我的要求类似于嵌套排序功能。我可以为嵌套字段提供路径和过滤逻辑,然后使用排序模式聚合结果。我需要类似的过滤功能。

elasticsearch spring-data-elasticsearch
1个回答
0
投票

此查询应返回包含汽车类型= Toyota并且值大于100的所有文档

{
"query":{
    "bool":{
        "filter":[
            {
                "nested":{
                    "path":"cars",
                    "query":{
                        "bool":{
                            "must":[
                                {
                                    "term":{
                                        "cars.brand":"toyota"
                                    }
                                },
                                {
                                    "range":{
                                        "cars.value":{
                                            "gt":100
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        ]
    }
}}

并且,如果您正在寻找聚合的嵌套过滤,则可以检查此链接https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html

© www.soinside.com 2019 - 2024. All rights reserved.