2015-05-05 105 views
1

我的文档结构看起来像这样:弹性搜索聚合组值

{ 
"title" : "A title", 
"ExtraFields": [ 
    { 
     "value": "print", 
     "fieldID": "5535627631efa0843554b0ea" 
    } 
    , 
    { 
     "value": "POLYE", 
     "fieldID": "5535627631efa0843554b0ec" 
    } 
    , 
    { 
     "value": "30", 
     "fieldID": "5535627631efa0843554b0ed" 
    } 
    , 
    { 
     "value": "0", 
     "fieldID": "5535627631efa0843554b0ee" 
    } 
    , 
    { 
     "value": "0", 
     "fieldID": "5535627731efa0843554b0ef" 
    } 
    , 
    { 
     "value": "0.42", 
     "fieldID": "5535627831efa0843554b0f0" 
    } 
    , 
    { 
     "value": "40", 
     "fieldID": "5535627831efa0843554b0f1" 
    } 
    , 
    { 
     "value": "30", 
     "fieldID": "5535627831efa0843554b0f2" 
    } 
    , 
    { 
     "value": "18", 
     "fieldID": "5535627831efa0843554b0f3" 
    } 
    , 
    { 
     "value": "24", 
     "fieldID": "5535627831efa0843554b0f4" 
    } 
] 
} 

理想的输出是(最好的情况下):

[ 
{ 
    "field" : "5535627831efa0843554b0f4", 
    "values" : [ 
     { 
      "label" : "24", 
      "count" : 2 
     }, 
     { 
      "label" : "18", 
      "count" : 5 
     } 
    ] 
}, 
{ 
    "field" : "5535627831efa0843554b0f3", 
    "values" : [ 
     { 
      "label" : "cott", 
      "count" : 20 
     }, 
     { 
      "label" : "polye", 
      "count" : 12 
     } 
    ] 
} 
] 

但我也可以做一个更简单的一个喜欢(这是我如何得到它在MongoDB现在):

[ 
{ 
    "field" : "5535627831efa0843554b0f4", 
    "value" : "24", 
    "count" : 2 
}, 
{ 
    "field" : "5535627831efa0843554b0f4", 
    "value" : "18", 
    "count" : 5 
}, 
{ 
    "field" : "5535627831efa0843554b0f3", 
    "value" : "cott", 
    "count" : 20 
}, 
{ 
    "field" : "5535627831efa0843554b0f3", 
    "value" : "polye", 
    "count" : 12 
} 
] 

聚合查询将如何看起来像?这个结构有什么特殊的映射?

回答

1

为了得到你想要的,你需要nested映射为ExtraFields子结构。您的文档映射是这样的(doctype是我选择来命名您的文档类型的术语,但它可以是你现在有什么):

PUT /test/_mapping/doctype 
{ 
    "doctype": { 
    "properties": { 
     "title": { 
     "type": "string" 
     }, 
     "ExtraFields": { 
     "type": "nested", 
     "properties": { 
      "value": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "fieldID": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
} 

然后,你可以索引文档

PUT /test/doctype/123 
{ 
    "title" : "A title", 
    "ExtraFields": [ 
     ... 
    ] 
} 

并发送以下聚集查询:

POST /test/doctype/_search 
{ 
    "size": 0, 
    "aggs": { 
    "fields": { 
     "nested": { 
     "path": "ExtraFields" 
     }, 
     "aggs": { 
     "fields": { 
      "terms": { 
      "field": "ExtraFields.fieldID" 
      }, 
      "aggs": { 
      "values": { 
       "terms": { 
       "field": "ExtraFields.value" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

这将产生你在最好的情况下突显的结果,虽然在respons的JSON字段名e被命名有点不同,但我想没关系。

试一试,让我们知道。

+0

谢谢,我会设置它并让你知道 – mbouclas

+0

它似乎有点工作。我说的是因为聚合不包含所有的结果。看起来它只能持有10每场或类似 – mbouclas

+0

好吧,明白了,每个聚合有一个大小参数。实际上意义...这工作得很好,非常感谢 – mbouclas