Elasticsearch - 返回聚合以匹配特定值?

时间:2016-05-06 18:49:15

标签: elasticsearch aggregation

使用Elasticsearch 2,是否可以返回文档类别与特定字段值匹配的聚合?例如,我想获得categories.type =" application"。

的所有类别

我的映射如下所示:

"mappings": {
    "products": {
        "_all": {
            "enabled": true
        }, 
        "properties": { 
            "title": {
                "type": "string"
            },
            "categories": {
                "type":"nested",
                "properties": {
                    "type": {
                        "type": "string", 
                        "index": "not_analyzed"
                    },
                    "name": {
                        "type": "string",
                        "index": "not_analyzed"
                    }
                }
            }
        }
    }
}

我的查询看起来像这样,返回所有类别类型,但我想过滤那些categories.type =" application"。

{  
    "query":{  
        "multi_match": {  
            "query": "Sound",
            "fields": [  
                "title"
            ]
        }
    },
    "aggs":{
        "Applications": {
            "nested": {
                "path": "categories"
            },
            "aggs": {
                "meta": {
                    "terms": {
                        "field": "categories.type"
                    },
                    "aggs": {
                        "name": {
                            "terms": {
                                "field": "categories.name"
                            }
                        }
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以使用aggregation filter

{   
    size : 50,
    "query":{  
        "multi_match": {  
            "query": "Sound",
            "fields": [  
                "title"
            ]
        }
    },
    "aggs":{
        "Applications": {
            "nested": {
                "path": "categories"
            },
            "aggs": {
                "meta": {
                    "filter" : {
                        "term" : {
                            "categories.type" : "application"
                        }
                    },
                    "aggs": {
                        "name": {
                            "terms": {
                                "field": "categories.name"
                            }
                        }
                    }
                }
            }
        }
    }
}

希望帮助。

答案 1 :(得分:1)

您只需要将“include”:“。*”替换为“include”:“application”

{  
    "query":{  
        "multi_match": {  
            "query": "Sound",
            "fields": [  
                "title"
            ]
        }
    },
    "aggs":{
        "Applications": {
            "nested": {
                "path": "categories"
            },
            "aggs": {
                "meta": {
                    "terms": {
                        "field": "categories.type"
                        , "include": "application"
                    },
                    "aggs": {
                        "name": {
                            "terms": {
                                "field": "categories.name"
                            }
                        }
                    }
                }
            }
        }
    }
}