我可以将Elasticsearch中的条目中的值和最高的顺序相加吗?

时间:2016-03-15 15:26:33

标签: elasticsearch

我正在为"快速查询"尝试一系列不同的选项。的个人资料数据。我的第一个试验是我设置了MemSQL并创建了一个这样的表:

username (PK) | attribute (PK) | value

然后,如果我有一些数据,如(但有更多属性):

matt          | strength       | 32
matt          | dexterity      | 57
matt          | magic          | 13
...
fred          | strength       | 41
fred          | dexterity      | 66
fred          | magic          | 35
...

然后,如果我想让用户获得力量和灵巧度的最高组合,我可以做一个简单的查询,如:

SELECT username, sum(value) FROM profiles
where attribute in ('strength', 'dexterity')
group by username
order by sum(value) desc

这很有效,但效果不如我所希望的那么高。因此,既然我们已经在我们公司的其他部分使用了弹性搜索,并且它的扩展性很好,而且新发布的版本具有“聚合”和“聚合”。功能,我想也许我可以使用它。

所以我创建了一堆配置文件:

    "_index": "profiles",
    "_type": "profile",
    "_id": "matt",
    "_source": {
       "strength": 73,
       "magic": 19,
       "dexterity": 34
    }

但是看一下这里的文档:https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-metrics-sum-aggregation.html,我可以看到如何在很多不同的配置文件中对相同的字段求和:

"aggs" : {
    "intraday_return" : { 
        "sum" : { 
            "field" : "strength" 
        }
    }
}

但如何在同一个个人资料中汇总不同的字段,并获得得分最高的个人资料?我是否会进行某种嵌套,将“最大”组合在一起。功能与'总和'功能

1 个答案:

答案 0 :(得分:1)

你必须使用sub aggregtaion

{
 "aggs": {
  "group by profile": {
     "terms": {
        "field": "userName",
        "order": {
           "intraday_return": "desc"
        }
      },
     "aggs": {
        "intraday_return": {
            "sum": {
          "script": "doc['strength'].value + doc['dexterity'].value"
       }
        }
     }
    }
  }
 }

确保to enable scripting