我在其中一个elasticsearch索引中有这个映射: {FirmID,UserID,ShareID}
数据是这样的:
FirmID UserID ShareID
f1 u1 1
f1 u1 2
f1 u2 3
f1 u2 4
f2 u3 5
f2 u3 6
f2 u3 7
f2 u4 8
f3 u5 9
f3 u5 10
我想获得每个公司中每个用户的FirmID,UserID,Last Share ID(最大值),份额数。 TSql查询如下:
select FirmID,
UserID,
Max(ShareID) as LastShareID,
Count(ShareID) as NumberOfShares
from tblShares
group by FirmID, UserID
FirmID UserID LastShareID NumberOfShares
f1 u1 2 2
f1 u2 4 2
f2 u3 7 3
f2 u4 8 1
f3 u5 10 2
但我需要生成elasticsearch查询。任何人都可以在ES中给我正确的查询以获得相同的结果吗?
答案 0 :(得分:0)
首先,您需要为您的类型定义映射。由于您希望在字符串字段上执行聚合,因此您需要将它们定义为关键字。
{
"mappings": {
"mytype": {
"properties": {
"firmId": {
"type": "keyword"
},
"userId": {
"type": "keyword"
}
}
}
}
}
}
然后您可以索引数据。来自sql的多个字段分组可以作为Elasticsearch中的嵌套聚合来实现。所以firstId的第一级组,userId的第二级组,然后我们需要添加一些指标。文档计数是开箱即用的,因此我们只需要添加 max 聚合。所以整个查询应该如下所示:
{
"aggs": {
"firm_agg": {
"terms": {
"field": "firmId"
},
"aggs": {
"user_agg": {
"terms": {
"field": "userId"
},
"aggs" : {
"last_share_id" : { "max" : { "field" : "shareId" } }
}
}
}
}
}
}
您的结果将被嵌套,因此在f1存储桶中,将有u1和u2,依此类推。
{
"aggregations":{
"firm_agg":{
"doc_count_error_upper_bound":0,
"sum_other_doc_count":0,
"buckets":[
{
"key":"f1",
"doc_count":4,
"user_agg":{
"doc_count_error_upper_bound":0,
"sum_other_doc_count":0,
"buckets":[
{
"key":"u1",
"doc_count":1,
"last_share_id":{
"value":2.0
}
},
{
"key":"u2",
"doc_count":1,
"last_share_id":{
"value":4.0
}
}
]
}
...
}