ElasticSearch(七):聚合分析简介

ElasticSearch(七):聚合分析简介

学习课程链接《Elasticsearch核心技术与实战》


## 什么是聚合(Aggregation) * ElasticSearch除了搜索外,还提供了针对ElasticSearch数据进行统计分析的功能 * 通过聚合,会得到一个数据的概览,这样就可以分析和总结全套的数据,而不是仅仅能寻找单个文档 * 易用性,只需要一条语句,就可以从ElasticSearch中得到分析结果,从而避免在客户端实现分析逻辑
## 聚合的分类 * Bucket Aggregation:一些列满足特定条件的文档集合,其相当于SQL中的Group By * Metric Aggregation:一些数学运算,可以对文档字段进行统计分析 - 其相当于SQL中对于字段进行运算的函数,如Sum、Count等。它除了可以在字段上进行计算,还可以在脚本产生的结果上进行计算 - 大多数Metric是数学计算,输出一个值,如:min/max/sum/avg/cardinality - 部分支持输出多个值,如:stats/percentiles/percentile_ranks * Pipeline Aggregation:对其他的聚合结果进行二次聚合 * Matrix Aggregation:支持对多个字段的操作并提供一个结果矩阵
## 一些聚合分析例子
#按照目的地进行分桶统计
GET kibana_sample_data_flights/_search
{
	"size": 0,
	"aggs":{
		"flight_dest":{
			"terms":{
				"field":"DestCountry"
			}
		}
	}
}
#查看航班目的地的统计信息,增加平均,最高最低价格
GET kibana_sample_data_flights/_search
{
	"size": 0,
	"aggs":{
		"flight_dest":{
			"terms":{
				"field":"DestCountry"
			},
			"aggs":{
				"avg_price":{
					"avg":{
						"field":"AvgTicketPrice"
					}
				},
				"max_price":{
					"max":{
						"field":"AvgTicketPrice"
					}
				},
				"min_price":{
					"min":{
						"field":"AvgTicketPrice"
					}
				}
			}
		}
	}
}
#价格统计信息+天气信息
GET kibana_sample_data_flights/_search
{
	"size": 0,
	"aggs":{
		"flight_dest":{
			"terms":{
				"field":"DestCountry"
			},
			"aggs":{
				"stats_price":{
					"stats":{
						"field":"AvgTicketPrice"
					}
				},
				"wather":{
				  "terms": {
				    "field": "DestWeather",
				    "size": 5
				  }
				}

			}
		}
	}
}

    public boolean getJuelExpression(JSONObject condition, JSONObject formData) {
        StringBuilder juelExpression = new StringBuilder();
        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();

        String logic = condition.getString("logic");
        JSONArray groups = condition.getJSONArray("groups");
        int groupSize = groups.size();
        for (int i = 0; i < groupSize; i++) {
            JSONObject group = groups.getJSONObject(i);
            if (i == 0) {
                juelExpression.append("(");
            } else {
                juelExpression.append(logic + "(");
            }
            String groupLogic = group.getString("logic");
            JSONArray expressions = group.getJSONArray("expressions");
            int expressionSize = expressions.size();
            for (int j = 0; j < expressionSize; j++) {
                JSONObject expression = expressions.getJSONObject(j);
                String field = expression.getString("field");
                String compare = expression.getString("compare");
                String type = expression.getString("type");
                if ("String".equals(type)) {
                    String valueStr = expression.getString("value");
                    //valueStrKey防止变量名重复
                    String valueStrKey = field + "ValueStr" + i + j;
                    if (j == 0) {
                        if (compare.equals("==")) {
                            juelExpression.append(field + ".equals(" + valueStrKey + ")");
                        } else if (compare.equals("!=")) {
                            juelExpression.append("!" + field + ".equals(" + valueStrKey + ")");
                        }
                    } else {
                        if (compare.equals("==")) {
                            juelExpression.append(groupLogic + field + ".equals(" + valueStrKey + ")");
                        } else if (compare.equals("!=")) {
                            juelExpression.append(groupLogic + "!" + field + ".equals(" + valueStrKey + ")");
                        }
                    }
                    context.setVariable(field, factory.createValueExpression(formData.getString(field), String.class));
                    context.setVariable(valueStrKey, factory.createValueExpression(valueStr, String.class));
                    logger.info("field:{},fieldValue:{},valueStrKey:{},valueStr:{}", field, formData.getString(field), valueStrKey, valueStr);
                } else if ("Number".equals(type)) {
                    long valueNum = expression.getLongValue("value");
                    //valueNumKey防止变量名重复
                    String valueNumKey = field + "ValueStr" + i + j;
                    if (j == 0) {
                        juelExpression.append(field + compare + valueNumKey);
                    } else {
                        juelExpression.append(groupLogic + field + compare + valueNumKey);
                    }
                    context.setVariable(field, factory.createValueExpression(formData.getLongValue(field), long.class));
                    context.setVariable(valueNumKey, factory.createValueExpression(valueNum, long.class));
                    logger.info("field:{},fieldValue:{},valueNumKey:{},valueNum:{}", field, formData.getLongValue(field), valueNumKey, valueNum);
                } else {
                    //级联类型type为:Cascade
                    JSONArray valueArr = expression.getJSONArray("value");
                    //valueArrKey防止变量名重复
                    String valueArrKey = field + "ValueArr" + i + j;
                    if (j == 0) {
                        if (compare.equals(".contains")) {
                            juelExpression.append(field + ".containsAll(" + valueArrKey + ")");
                        } else if (compare.equals("!.contains")) {
                            juelExpression.append("!" + field + ".containsAll(" + valueArrKey + ")");
                        } else if (compare.equals("==")) {
                            juelExpression.append(field + ".equals(" + valueArrKey + ")");
                        } else if (compare.equals("!=")) {
                            juelExpression.append("!" + field + ".equals(" + valueArrKey + ")");
                        }
                    } else {
                        if (compare.equals(".contains")) {
                            juelExpression.append(groupLogic + field + ".containsAll(" + valueArrKey + ")");
                        } else if (compare.equals("!.contains")) {
                            juelExpression.append(groupLogic + "!" + field + ".containsAll(" + valueArrKey + ")");
                        } else if (compare.equals("==")) {
                            juelExpression.append(groupLogic + field + ".equals(" + valueArrKey + ")");
                        } else if (compare.equals("!=")) {
                            juelExpression.append(groupLogic + "!" + field + ".equals(" + valueArrKey + ")");
                        }
                    }
                    context.setVariable(field, factory.createValueExpression(formData.getJSONArray(field), JSONArray.class));
                    context.setVariable(valueArrKey, factory.createValueExpression(valueArr, JSONArray.class));
                    logger.info("field:{},fieldValue:{},valueArrKey:{},valueArr:{}", field, formData.getJSONArray(field), valueArrKey, valueArr);
                }
            }
            juelExpression.append(")");
        }
        String lastJuel = "${" + juelExpression.toString() + "}";
        logger.info("lastJuel:{} ", lastJuel);
        ValueExpression e = factory.createValueExpression(context, lastJuel, boolean.class);
        return (boolean) e.getValue(context);
    }
posted @ 2019-12-13 11:29  牧汜  阅读(272)  评论(0编辑  收藏  举报