2016-11-11 71 views
2

例如,我的映射具有一個屬性「itemDetails」,類似這樣的和聚集elasticsearch

{ 
    "properties":{ 
    "itemDetails":{ 
     "properties":{ 
     "id1":{"type": "long"}, 
     "iddetailCode1": {"type": "string"}, 
     "id2":{"type": "long"}, 
     "iddetailCode2": {"type": "string"}, 
     "amount": {"type": "double"} 
     } 
    } 
    } 
} 

和一個項目,它有多個記錄。我想通過iddetailCode1進行分組,並總結所有的數量。但是,如果兩個rocords數量相同,則只計算一次,我無法獲得正確的數據。

我的查詢是這樣的。

{ 
    "aggs": { 
    "user_likes": { 
     "terms": { 
     "field": "itemDetails.entityDetailCode1" 
     }, 
     "aggs": { 
     "likes_sum": { 
      "sum": { 
      "field": "itemDetails.amount" 
      } 
     } 
     } 
    } 
    } 
} 
+0

聚集條款每創造獨特的價值一個桶,並在這些桶的數不是100%準確。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html – Gavin

+0

謝謝加文,是的,這就是爲什麼最後我使用嵌套聚合,可以給我們準確的結果。 – Kazehaya

回答

1

最後,我有解決方案,在這種情況下,把映射時,我們必須改變「itemDetails」到「嵌套」的數據類型。 「嵌套類型是對象數據類型的專用版本,它允許對象數組相互獨立地進行索引和查詢。」 映射應該是:

{ 
    "properties":{ 
    "itemDetails":{ 
     "type": "nested", 
     "properties":{ 
     "id1":{"type": "long"}, 
     "iddetailCode1": {"type": "string"}, 
     "id2":{"type": "long"}, 
     "iddetailCode2": {"type": "string"}, 
     "amount": {"type": "double"} 
     } 
    } 
    } 
} 

和查詢應該是

{ 
"aggs": { 
    "nestedName": { 
     "nested": { 
     "path": "itemDetails" 
     }, 
     "aggs": { 
     "Groupby": { 
      "terms": { 
      "field": "itemDetails.iddetailCode1", 
      "size": 50 
      }, 
      "aggs": { 
      "amount": { 
       "sum": { 
       "field": "itemDetails.amount" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}