2015-09-01 77 views
6

我无法使elasticsearch聚合+过滤器适用于嵌套字段。数据架构(相关部分)是这样的:Elasticsearch聚合不适用于嵌套类型字段

"mappings": { 
    "rb": { 
    "properties": { 
     "project": { 
     "type": "nested", 
     "properties": { 
      "age": { 
      "type": "long" 
      }, 
      "name": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     }  
    } 
    } 
} 

本质“RB”对象包含一个名为“项目”,其中包含两个字段的嵌套场 - “名”和“年龄”。查询我运行:

"aggs": { 
    "root": { 
    "aggs": { 
     "group": { 
     "aggs": { 
      "filtered": { 
      "aggs": { 
       "order": { 
       "percentiles": { 
        "field": "project.age", 
        "percents": ["50"] 
       } 
       } 
      }, 
      "filter": { 
       "range": { 
       "last_updated": { 
        "gte": "2015-01-01", 
        "lt": "2015-07-01" 
       } 
       } 
      } 
      } 
     }, 
     "terms": { 
      "field": "project.name", 
      "min_doc_count": 5, 
      "order": { 
      "filtered>order.50": "asc" 
      }, 
      "shard_size": 10, 
      "size": 10 
     } 
     } 
    }, 
    "nested": { 
     "path": "project" 
    } 
    } 
} 

这个查询应该产生前10名项目(project.name场)匹配日期过滤器,通过他们的平均年龄排序其中,忽视了项目不到5提到数据库。只应为与过滤器匹配的项目(日期范围)计算中间值。

尽管数据库中有超过十万个对象,但此查询会生成空列表。没有错误,只是空的回应。我已经在ES 1.6和ES 2.0-beta上试过了。

回答

7

我已经重新组织了你的聚合查询,我可以得到一些结果。主要观点是类型,因为您正在聚合nested类型,我在last_updated字段上取出filter聚合,并将其作为第一个聚合向上移动到层次结构中。然后在project字段上输入nested汇总,最后输入termspercentile

这似乎工作得很好。请尝试。

{ 
    "size": 0, 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "last_updated": { 
      "gte": "2015-01-01", 
      "lt": "2015-07-01" 
      } 
     } 
     }, 
     "aggs": { 
     "root": { 
      "nested": { 
      "path": "project" 
      }, 
      "aggs": { 
      "group": { 
       "terms": { 
       "field": "project.name", 
       "min_doc_count": 5, 
       "shard_size": 10, 
       "order": { 
        "order.50": "asc" 
       }, 
       "size": 10 
       }, 
       "aggs": { 
       "order": { 
        "percentiles": { 
        "field": "project.age", 
        "percents": [ 
         "50" 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

它的工作原理!我只需将shard_size增加到100即可获得10个值。你介意解释为什么我原来的变体不起作用? ES中的限制是它不支持嵌套字段中的过滤器吗? – extesy

+1

在“嵌套”聚合中,您只能引用嵌套字段。此外,首先根据last_updated过滤掉数据,然后才能对嵌套数据进行操作。 – Val

+0

@Val - 你能告诉我怎么做多值桶? 分开的问题 - http://stackoverflow.com/questions/43451667/elasticsearch-ordering-aggregation-by-nested-aggregation-on-nested-field –

相关问题