ES问题来源

es中的一个字段用来标识当前ABTest各种组的ABsign,比如ABGROUP:G1,G2,对应的ABsign:a、b,排列组合会有四种情况。所以在es中保留一个字段:G1:a,G2:b,来表示当次是那种ABtest组合。
需求就是根据ABGROUP中的一种进行聚合,即sql中的groupby,然后得出对应ABsign的表现数据。比如要按照G2进行groupby聚合,那么结果应该有两条结果a行,b行。方便对比表现数据。

实现原理composite(多桶聚合)

实现依赖于composite的script groupby聚合

int index = doc['ab'].value.lastIndexOf('g1:');
return doc['ab'].value.substring(index+1,index+3)

第一行g1:为传参,即ABGROUP,第二句拿到g1的absign。
script使用的是painless,即无痛脚本语言,来源于java阉割,但是保留了java里的大部分特征。所以写script不知道怎么用的时候,可以直接搜java
比如子串的匹配查找,跟php的substr有差别。

附录

 {
    "aggregations": {
          "my_buckets": {
             "composite": {
                "sources": [
                  {
                       "gp_ab": {
                         "terms": {
                            "script": {
                               "inline": "int last = doc['ab'].value.lastIndexOf('g1:');return doc['ab'].value.substring(last+1,last+3)",
                               "lang": "painless"
                            }
                         }
                      }
                   }
                ],
                "size": "10000"
             },
             "aggregations": {
                "sum_requests": {
                   "sum": {
                      "field": "requests"
                   }
                }
     }
}

引用

composite多桶聚合script group