2016-10-15 61 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將是用戶數量的