elasticsearch中的嵌套聚合

时间:2016-02-02 20:09:04

标签: elasticsearch elasticsearch-plugin

我正在尝试使用elasticsearch实现自动完成功能。我正在研究的指数的结构是这个

"title": "blog post 1",
"body": "body of the blog post",
"category": "programming",
"locations": [
    {"name": "united states"}, 
    {"name": "new york"}, 
    {"name": "venice"}
]

我正在尝试使用嵌套聚合。我正在使用的映射是

{                            
  blog : {                   
    mappings : {             
      tag : {                
        properties : {       
          body : {           
            type : string    
          },                 
          category : {       
            type : string    
          },                 
          locations : {      
            properties : {   
              name : {       
                type : string
              }              
            }                
          },                 
          title : {          
            type : string    
          }                  
        }                    
      }                      
    }                        
  }                          
}

应该基于locations.name聚合结果的查询是

GET /blog/tag/_search
{
    "size": 0, 
    "query": {
        "match": {
            "locations.name": "montreal"
        }
    },
    "aggs": {
        "aggregated_locations": {
            "nested": {
                "path": "locations"
            },
            "aggs": {
                "filtered_locations": {
                   "terms": {
                      "fields": "locations.name"
                   }
                }
            }
        }
    }
}

目前我正在使用chromesearch的弹性搜索执行上述请求。上面的查询给出了一个错误,这个错误很长但是如果有人提示我也可以发布。我想我在解释嵌套聚合的含义时可能是错的,这意味着我的映射是错误的。但我无法弄清楚问题出在哪里。

1 个答案:

答案 0 :(得分:2)

您的地图中有一些缺失的部分,您需要将位置字段设置为nested类型,而不是分析内部字段以便能够根据您的期望进行汇总:

PUT blog
{
  "mappings": {
    "tag": {
      "properties": {
        "body": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "locations": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}

然后运行以下查询以过滤嵌套字段,并在嵌套字段上聚合:

GET blog/_search
{
  "size": 0, 
  "query": {
    "nested": {
      "path": "locations",
      "query": {
        "match": {
          "locations.name": "montreal"
        }
      }
    }
  },
  "aggs": {
    "aggregated_locations": {
      "nested": {
        "path": "locations"
      },
      "aggs": {
        "filtered": {
          "terms": {
            "field": "locations.name"
          }
        }
      }
    }
  }
}

可以在意义上复制/粘贴这些查询(https://www.elastic.co/guide/en/sense/current/installing.html