2016-02-12 97 views
0

假设我有一个存储人的物理属性的映射,并且该映射中的一个字段是用户标识。例如:如何在elasticsearch中通过基数来计算元素?

"attributes": { 
     "hair_color": { 
     "type": "string" 
     }, 
     "eyes_color": { 
     "type": "string" 
     }, 
     "height": { 
     "type": "float" 
     }, 
     "user_id": { 
     "type": "integer" 
     } 
    } 

我想做一个查询,将返回有多少人有给定的眼睛颜色。例如,它会返回类似于“绿色”的东西:962.

我认为我需要做的是eye_color字段的术语桶,然后考虑user_id的基数子聚合,但我没有'到目前为止成功。这是我有:

{ 
"aggs" : { 
    "eyes_color_bucket" : { 
     "terms" : { 
      "field" : "eyes_color" 
     } 
    }, 
    "aggs":{ 
     "count":{ 
      "cardinality":{ 
       "field": "eyes_color_bucket" 
      } 
     } 
    } 
} 

哪个当然失败。任何帮助赞赏。

回答

1

就快,试试这样说:

{ 
    "size": 0, 
    "aggs": { 
    "eyes_color_bucket": { 
     "terms": { 
     "field": "eyes_color" 
     }, 
     "aggs": { 
     "count": { 
      "cardinality": { 
      "field": "user_id" 
      } 
     } 
     } 
    } 
    } 
} 

UPDATE

下方Richa的评论跟进,如果你作一个假设,一个用户只能有一个眼睛的颜色(即没有镜头或任何),你可以简化你的聚合查询是这样的:

{ 
    "size": 0, 
    "aggs": { 
    "eyes_color_bucket": { 
     "terms": { 
     "field": "eyes_color" 
     } 
    } 
    } 
} 

doc_count你g在每个桶中应该是具有该眼睛颜色的用户的数量。感谢@Richa提出这一点。

+0

不会doc_count为任何关键会给人数?或者我错过了什么? – Richa

+1

是的,仅当每个'user_id' /'eyes_color'对只有一个文档时。人们可以想象如果他们考虑使用镜头,则为每个人存储多种眼睛颜色。不太可能,但可能。 – Val

+0

thnx的解释。 – Richa

相关问题