2016-03-08 120 views
1

我有以下文件:Elasticsearch - 聚集排序指标

POST index/type 
{ 
    "profile": { 
    "tracks": [ 
     { 
     "title": "Track 1", 
     "count": 5 
     }, 
     { 
     "title": "Track 2", 
     "count": 3 
     } 
    ] 
    } 
} 

POST index/type 
{ 
    "profile": { 
    "tracks": [ 
     { 
     "title": "Track 2", 
     "count": 8 
     }, 
     { 
     "title": "Track 3", 
     "count": 1 
     } 
    ] 
    } 
} 

POST index/type 
{ 
    "profile": { 
    "tracks": [ 
     { 
     "title": "Track 4", 
     "count": 20 
     }, 
     { 
     "title": "Track 5", 
     "count": 1 
     } 
    ] 
    } 
} 

,其中“算”,在每个轨道项目属性是曾扮演特定的轨道倍的用户数量。

我想要按照播放次数排列曲目列表。所以在上面的例子中,预期的结果将是:

[ 
    { 
    "key": "Track 4", 
    "count": { 
     "value": 20 
    } 
    }, 
    { 
    "key": "Track 2", 
    "count": { 
     "value": 11 
    } 
    }, 
    { 
    "key": "Track 1", 
    "count": { 
     "value": 5 
    } 
    }, 
    { 
    "key": "Track 3", 
    "count": { 
     "value": 1 
    } 
    }, 
    { 
    "key": "Track 5", 
    "count": { 
     "value": 1 
    } 
    } 
] 

我曾尝试:

"aggs": { 
    "track_count": { 
    "terms": { 
     "field": "profile.tracks.title", 
     "order": { 
      "count": "desc" 
     } 
    }, 
    "aggs": { 
     "count": { 
      "sum": { 
       "field": "profile.tracks.count" 
      } 
     } 
    } 
    } 
} 

但它似乎并不正确,因为计数是通过对所有其他计数性能计算每个轨道项目。

我不知道如何构建我的聚合,以便通过对其他文档中相同曲目的计数属性进行求和来计算计数值。

任何帮助将不胜感激。谢谢。

回答

1

在映射中确保tracksnested-type

实施例:

put test/test/_mapping 
{ 
    "properties" : { 
     "profile" : { 
      "properties" : { 
       "tracks" : { 
        "type" : "nested" , 
        "properties" : { 
         "title" : 
         { 
          "type" : "string", 
          "index" : "not_analyzed" 
         }, 
         "count" :{ 
          "type" : "integer" 
         } 
        } 
       } 

      } 
     } 
    } 
} 

一旦标记为嵌套一个可以再使用nested aggregations实现上述。

例子:

{ 
    "size": 0, 
    "aggs": { 
     "tracks_agg": { 
     "nested": { 
      "path": "profile.tracks" 
     }, 
     "aggs": { 
      "tracks": { 
       "terms": { 
        "field": "profile.tracks.title", 
        "order": { 
        "count": "desc" 
        } 
       }, 
       "aggs": { 
        "count": { 
        "sum": { 
         "field": "profile.tracks.count" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 
+0

太好了!有用!感谢您的帮助。 – passkey1510