2016-09-23 464 views
3

我有以下簡單的映射:ElasticSearch - 字符串concat聚合?

"element": { 
    "dynamic": "false", 
    "properties": { 
    "id": { "type": "string", "index": "not_analyzed" }, 
    "group": { "type": "string", "index": "not_analyzed" }, 
    "type": { "type": "string", "index": "not_analyzed" } 
    } 
} 

這基本上是存儲Group對象的方式:

{ 
    id : "...", 
    elements : [ 
    {id: "...", type: "..."}, 
    ... 
    {id: "...", type: "..."} 
    ] 
} 

我想找到許多不同的團體存在如何共享同一組元素類型(有序,包括重複)。

一個顯而易見的解決辦法是,將模式改爲:

"element": { 
    "dynamic": "false", 
    "properties": { 
    "group": { "type": "string", "index": "not_analyzed" }, 
    "concatenated_list_of_types": { "type": "string", "index": "not_analyzed" } 
    } 
} 

但是,由於要求,我們需要能夠通過(聚集):(

從組中排除某些類型該文件的所有字段都蒙戈的ID,所以在SQL我會做這樣的事情:

SELECT COUNT(id), concat_value FROM (
    SELECT GROUP_CONCAT(type_id), group_id 
    FROM table 
    WHERE type_id != 'some_filtered_out_type_id' 
    GROUP BY group_id 
) T GROUP BY concat_value 

彈性與給定的映射它真的很容易過濾掉,它也不是一個問題算一個假設我們有一個分值。不用說,總和聚合不適用於字符串。

我該如何得到這個工作? :)

謝謝!

回答

1

最後我用scripting和改變映射解決了這個問題。

{ 
    "mappings": { 
    "group": { 
     "dynamic": "false", 
     "properties": { 
     "id": { "type": "string", "index": "not_analyzed" }, 
     "elements": { "type": "string", "index": "not_analyzed" } 
     } 
    } 
    } 
} 

還存在一些問題,由於某種原因在數組重複的元素(ScriptDocValues.Strings)剔除了DUP的,但在這裏是通過字符串連接計數聚合:

{ 
    "aggs": { 
    "path": { 
     "scripted_metric": { 
     "map_script": "key = doc['elements'].join('-'); _agg[key] = _agg[key] ? _agg[key] + 1 : 1", 
     "combine_script": "_agg", 
     "reduce_script": "_aggs.collectMany { it.entrySet() }.inject([:]) { result, e -> result << [ (e.key):e.value + (result[ e.key ] ?: 0) ]}" 
     } 
    } 
    } 
} 

其結果將是如下:

"aggregations" : { 
    "path" : { 
     "value" : { 
     "5639abfb5cba47087e8b457e" : 362, 
     "568bfc495cba47fc308b4567" : 3695, 
     "5666d9d65cba47701c413c53" : 14, 
     "5639abfb5cba47087e8b4571-5639abfb5cba47087e8b457b" : 1, 
     "570eb97abe529e83498b473d" : 1 
     } 
    } 
    }