ElasticSearchDSL查询模板之一(按日查询与按关键词聚类)

来源:互联网 发布:淘宝代理加盟商 编辑:程序博客网 时间:2024/06/07 08:34

最近工作忙得紧,又开始设计用户画像项目,又要做需求,所以博客有一段时间没有更新了,今天刚写完了一大波需求,所以也就抽出一点时间分享一些DSL查询模版,今天的分享从简单的一维聚类开始,可以按照某一字段中所有类别或者以日为单位,进行聚类


在开源这些方法对最开始,先定义几个全局变量,后面对方法中会用到:


private static final StringSELECT_FORMAT ="%s/%s/%s/_search";

privatestaticfinal StringSELECT_FORMAT_WITHOUT_TYPE ="%s/%s/_search";

private finalstatic DateFormatDATE_FORMAT=new SimpleDateFormat("yyyy-MM-dd");



一、ES标准查询general

下面的这一个方法用来把ES某type中所有数据根据存入的Unix时间戳进行通用查询,并可以通过传入的startAtendAt来控制查询的时间范围,其中host是查询的ES地址,query是匹配的查询条件(如没有可暂时用String query = "_type:"+type;代替


public static List general(String host, String index, String type, String query, String timeField, long startAt, long endAt) {Map timeRange = new HashMap();timeRange.put("gte", startAt);timeRange.put("lte", endAt);timeRange.put("format", "epoch_millis");Map paramMap = new HashMap();paramMap.put("query", query);paramMap.put("time_range", timeRange);paramMap.put("time_field", timeField);String url = String.format(SELECT_FORMAT, host, index, type);String template = FileUtil.stream2string(PropertiesUtil.getInputStream("template/general.json"));String resultJson = ElasticSearchUtil.selectByTemplate(url, template, paramMap);JsonArray dateArray = JsonUtil.toJsonMap(resultJson).getAsJsonObject("hits").getAsJsonArray("hits");List resultList = new ArrayList();for (JsonElement dateElement : dateArray) {resultList.add(dateElement.getAsJsonObject().getAsJsonObject("_source"));}return resultList;}

其对应的json如下:

{"size": 10000,"query": {"query_string": {"query": @query,"analyze_wildcard": true}},"filter": {"bool": {"must": [{"range": {@time_field: @time_range}}],"must_not": []}},"sort": [{@time_field: "asc"}]}

二、ES按日分割进行聚类查询gereralDate

下面的这一个方法用来把ES某type中所有数据根据存入的Unix时间戳按日分割进行聚类查询,参数意义与上面的方法一样,唯一不同之处,timeZone表示时区,可以指定要求查询的时区(一般都是UTC)

public static JsonObject generalDate(String host, String index, String type, String query, String timeZone, String timeField, long startAt, long endAt, String timeInterval) {Map timeRange = new HashMap();timeRange.put("gte", startAt);timeRange.put("lte", endAt);timeRange.put("format", "epoch_millis");Map paramMap = new HashMap();paramMap.put("query", query);paramMap.put("time_field", timeField);paramMap.put("time_range", timeRange);paramMap.put("time_interval", timeInterval);paramMap.put("time_zone", timeZone);Map extendedBounds = new HashMap();extendedBounds.put("min", startAt);extendedBounds.put("max", endAt);paramMap.put("extended_bounds", extendedBounds);String url = String.format(SELECT_FORMAT, host, index, type);String template = FileUtil.stream2string(PropertiesUtil.getInputStream("template/date.json"));return JsonUtil.toJsonMap(ElasticSearchUtil.selectByTemplate(url, template, paramMap));}


其对应的json如下:

{"size": 0,"query": {"filtered": {"query": {"query_string": {"query": @query,"analyze_wildcard": true}},"filter": {"bool": {"must": [{"range": {@time_field: @time_range}}],"must_not": []}}}},"aggs": {@time_field: {"date_histogram": {"field": @time_field,"interval": @time_interval,"time_zone": @time_zone,"extended_bounds": @extended_bounds}}}}

三、ES按某一类进行聚类查询generalAggr

与上述方法参数基本一致,aggr表示要聚类的字段,size是聚类显示的类的数目

public static JsonObject generalAggr(String host, String index, String type, String query, String timeField, long startAt, long endAt, String aggr, int size) {Map timeRange = new HashMap();timeRange.put("gte", startAt);timeRange.put("lte", endAt);timeRange.put("format", "epoch_millis");Map paramMap = new HashMap();paramMap.put("query", query);paramMap.put("aggr", aggr);paramMap.put("time_field", timeField);paramMap.put("time_range", timeRange);paramMap.put("size", size);String url = String.format(SELECT_FORMAT, host, index, type);String template = FileUtil.stream2string(PropertiesUtil.getInputStream("template/aggr.json"));return JsonUtil.toJsonMap(ElasticSearchUtil.selectByTemplate(url, template, paramMap));}

其对应的json如下:

{"size": 0,"query": {"filtered": {"query": {"query_string": {"query": @query,"analyze_wildcard": true}},"filter": {"bool": {"must": [{"range": {@time_field: @time_range}}],"must_not": []}}}},"aggs": {@aggr: {"terms": {"field": @aggr,"size": @size,"order": {"_count": "desc"}}}}}


其中值得注意的是

"order": {

"_count": "desc"

}

表示的是会对聚类的结果进行倒序排列,也就是按照数值多少进行从大到小的排列,如果想按照从小到大的顺序,去掉这段代码即可








1 0
原创粉丝点击