项目场景:
Elasticsearch使用scriptj脚本计算和统计,通过DSL和java API两种方式
解决方案:
一、DSL方式 :
1、计算结束时间减去开始时间时间差
{
"script" : {
"source": "(doc['completeTime'].value.toInstant().toEpochMilli() - doc['createTime'].value.toInstant().toEpochMilli())"
}
2、统计大于20岁用户访问次数
"aggs": {
"total": {
"sum": {
"script": {
"source": "if(doc['age'].value < 30) { return 0 ; } else { return doc['number'].value}",
"lang": "painless"
}
}
}
}
3、统计在朝阳区的用户人数
"aggs": {
"oh_total_count": {
"cardinality": {
"script": {
"source": "def address = doc['address'].value; if(address.indexOf(params['keyword']) == -1) { return null ; } else { return doc['_id'].value}",
"lang": "painless",
"params": {
"keyword": "朝阳区"
}
}
}
}
}
二、java API方式
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders
.avg("avg_grade")
.script(new Script("(doc['completeTime'].value.toInstant().toEpochMilli() - doc['createTime'].value.toInstant().toEpochMilli())"));