2016-10-15 57 views
0

我使用ElasticSearch索引某些用户属性,用户数据被mo​​ndel像下面,fxy是下组gxElasticSearch:嵌套聚合,但得到的根doc_count

User: { 
    g1: { 
    f11: ..., 
    f12: ..., 
    f13: ... 
    }, 
    g2: { 
    f21: ..., 
    f22: ..., 
    f23: ... 
    } 
} 

分组在一起一束性质的因此,我可以通过使用嵌套聚集

{ 
    "query": { 
    ... 
    }, 
    "aggs": { 
    "l1": { 
     "nested": { 
     "path": "g1" 
     }, 
     "aggs": { 
     "l2": { 
      "terms": { 
      "field": "g1.f11" 
      } 
     } 
     } 
    } 
    } 
} 

得到f11的前N个结果和反应就像是

{ 
    "aggregations": { 
    "l1": { 
     "doc_count": ....., 
     "l2": { 
     "buckets": [ 
      { 
      "key": k1, 
      "doc_count": ... 
      }, 
      { 
      "key": k2, 
      "doc_count": ... 
      } 
      ... 
     ] 
     } 
    } 
    } 
} 

我的问题是,嵌套聚合中的所有doc_count都是gxfxy=kz的数字。有没有办法让至少有一个gx的用户数满足fxy=kz

回答

0

目前我们的解决方法是在嵌套的对象到根级别对象

  • 重复数据
  • 查询的f11前N个结果,使用嵌套聚合第一
  • 申请的前N个结果返回作为其一部分查询过滤器,然后聚集在第一级字段。

这意味着

改变映射到

User: { 
    g1_f11: [], 
    g1_f12: [], 
    ... 
    g2_f21: [], 
    g2_f22: [], 
    ..., 
    g1: { 
    f11: ..., 
    f12: ..., 
    f13: ... 
    }, 
    g2: { 
    f21: ..., 
    f22: ..., 
    f23: ... 
    } 
} 

得到前N个结果字段f11,然后应用作为过滤器的一部分,并且骨料上g1_f11

{ 
    "query": { 
    "nested": { 
     "path": "g1", 
     "query": { 
     "should": [ 
      { 
      "match": { 
       "g1" { 
       "query": "k1" 
       }    
      } 
      }, 
      { 
      "match": { 
       "g1" { 
       "query": "k2" 
       }    
      } 
      }, 
      ... 
     ] 
     } 
    } 
    }, 
    "aggs": { 
    "l1": { 
     "terms": { 
     "fields": "g1_f11" 
     } 
    } 
    } 
} 

然后聚合输出中最后的doc_count将是用户数量的