1.业务背景
一家店会由多个人维护,一家店会绑定一个城市,现有需求需要找到某个人的常驻城市,具体需求如下,先找到这个人的所有店,再根据城市聚合店,算出店的数量,取店数量最多的城市,如果有多个城市的店数量相同,再根据维护时间倒叙,取时间最近的一家店.
2.数据模型
"salesmanRefList" : {
"type" : "nested",
"properties" : {
"_class" : {
"type" : "keyword",
"index" : false,
"doc_values" : false
},
"createTime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"employeeNo" : {
"type" : "keyword"
},
"entityWsCode" : {
"type" : "keyword"
},
"id" : {
"type" : "keyword"
},
"organizationCode" : {
"type" : "keyword"
},
"positionNo" : {
"type" : "keyword"
},
"postCategoryCode" : {
"type" : "keyword"
},
"updateTime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
}
}
},
"orgCode" : {
"type" : "keyword"
}
其中salesmanRefList是人店关系,positionNo是人,createTime是维护时间,org是城市
3.技术实现
难点在于nested数据类型的聚合,以及需要排除部分数据后的筛选
1,先拿到人的所有店
"query": {
"nested": {
"query": {
"term": {
"salesmanRefList.positionNo": {
"value": "12345678"
}
}
},
"path": "salesmanRefList"
}
}
2.第一次聚合,根据org聚合
"aggs": {
"poc_count_by_org": {
"terms": {
"field": "orgCode"
}
}
}
3.因为此时聚合出来的数据,有的人店关系可能不是自己的,所以需要对数据进行过滤,确保下一次聚合时的数据都是与自己相关的,但是nested类型不能直接聚合,需要在前套一层nested类型的聚合,所以这里套了两层聚合
"aggs": {
"salesmanRefList_nested":{
"nested": {
"path": "salesmanRefList"
},
"aggs": {
"positionNo_nested": {
"filter": {
"term": {
"salesmanRefList.positionNo": "12345678"
}
}
}
}
}
}
4.最后一次聚合,算出每个poc_count_by_org桶内createTime最大的值
"aggs": {
"max_createTime": {
"max": {
"field": "salesmanRefList.createTime"
}
}
}
5.最后设置排序,售点按照聚合org后的数量,其次是自己的维护时间文章来源:https://www.toymoban.com/news/detail-522615.html
"order": [
{
"_count": "desc"
},
{
"salesmanRefList_nested>positionNo_nested>max_createTime": "desc"
}
]
下面贴出完整dsl语句文章来源地址https://www.toymoban.com/news/detail-522615.html
{
"size": 0,
"query": {
"nested": {
"query": {
"term": {
"salesmanRefList.positionNo": {
"value": "12345678"
}
}
},
"path": "salesmanRefList"
}
},
"aggs": {
"poc_count_by_org": {
"terms": {
"field": "orgCode",
"order": [
{
"_count": "desc"
},
{
"salesmanRefList_nested>positionNo_nested>max_createTime": "desc"
}
]
},
"aggs": {
"salesmanRefList_nested":{
"nested": {
"path": "salesmanRefList"
},
"aggs": {
"positionNo_nested": {
"filter": {
"term": {
"salesmanRefList.positionNo": "12345678"
}
},
"aggs": {
"max_createTime": {
"max": {
"field": "salesmanRefList.createTime"
}
}
}
}
}
}
}
}
}
}
到了这里,关于Es的针对于nested类型的多重子聚合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!