过滤聚合存储桶密钥?

时间:2017-02-21 13:26:38

标签: elasticsearch nest

给出这样的数据模型结构,

{
    Id: 123,
    "string_facet": [
        {
            "name": "make",
            "value": "Audi"
        },
        {
            "name": "carListType",
            "value": "PERSON EU"
        },
        {
            "name": "modelType",
            "value": ""
        },
        {
            "name": "engineBrand",
            "value": "APT"
        },
        {
            "name": "typeDescription",
            "value": "8D2"
        }
    ],
    "number_facet": [
        {
            "name": "typeNumber",
            "value": 4614
        },
        {
            "name": "serialNumber",
            "value": 2
        },
        {
            "name": "engineSize",
            "value": 18
        },
        {
            "name": "horsePower",
            "value": 125
        },
        {
            "name": "kw",
            "value": 92
        },
        {
            "name": "engineVolume",
            "value": 1781
        },
        {
            "name": "listType",
            "value": 0
        }
    ],
    "dateTime_facet": [
        {
            "name": "fromDate",
            "value": "1999-04-01T00:00:00"
        },
        {
            "name": "toDate",
            "value": "2000-10-01T00:00:00"
        }
    ]    
}

我希望获得聚合方面名称和每个名称的值。但是,我只对具有特定名称的方面感兴趣,例如: make engineBrand 。请注意,facet是嵌套类型。

我尝试了以下.NEST表达式,但它仍然返回所有方面名称。

.Global("global", g => g
    .Aggregations(ag => ag
        .Filter("global_makes", f => f
            .Filter(ff => ff
                .Nested(n => n
                .Path("string_facet")
                .Filter(pf => pf.Term("string_facet.name", "make")))
                )
                .Aggregations(agg => agg
                    .Nested("nested_string_facet", nested => nested
                        .Path("string_facet")
                        .Aggregations(stringFacet => stringFacet
                            .Terms("name", nameAgg => nameAgg.Field("string_facet.name").Size(0)
                                .Aggregations(nameAggNext => nameAggNext
                                    .Terms("value", valueAgg => valueAgg.Field("string_facet.value").Size(0))
                                )
                            )
                        )
                    )
                )
            )
        )
    )
);

我在全局范围内有一个过滤器(失去传入查询的范围),然后仅在与“make”匹配的string_facet.name上进行过滤,但结果仍然包括所有其他名称。如何过滤掉聚合以仅包含 name 为“make”的存储桶?

1 个答案:

答案 0 :(得分:0)

这有帮助。 https://github.com/elastic/elasticsearch/issues/4449

基本上必须将过滤器部分更深入地移动到聚合中。