ElasticSearchDSL查询模板之一(按日查询与按关键词聚类)
来源:互联网 发布:淘宝代理加盟商 编辑:程序博客网 时间:2024/06/07 08:34
最近工作忙得紧,又开始设计用户画像项目,又要做需求,所以博客有一段时间没有更新了,今天刚写完了一大波需求,所以也就抽出一点时间分享一些DSL查询模版,今天的分享从简单的一维聚类开始,可以按照某一字段中所有类别或者以日为单位,进行聚类
privatestaticfinal StringSELECT_FORMAT_WITHOUT_TYPE ="%s/%s/_search";
private finalstatic DateFormatDATE_FORMAT=new SimpleDateFormat("yyyy-MM-dd");
一、ES标准查询general
下面的这一个方法用来把ES某type中所有数据根据存入的Unix时间戳进行通用查询,并可以通过传入的startAt和endAt来控制查询的时间范围,其中host是查询的ES地址,query是匹配的查询条件(如没有可暂时用String query = "_type:"+type;代替)
public static Listgeneral(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) {MaptimeRange = 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) {MaptimeRange = 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
- ElasticSearchDSL查询模板之一(按日查询与按关键词聚类)
- ElasticSearchDSL查询模板之二(二重聚合)
- 关于按日期查询
- 按日期查询记录
- MYSQL按日期查询
- 按日期查询
- MongoDB 日期查询与mongodump 按日期范围导出数据
- sql 按日期分组查询
- SQL按日期来查询
- 数查询按日期分组
- ADO.Net 按日期查询
- 按日期查询 并求和
- postgresql 按日期范围查询
- postgresql 按日期范围查询
- Linq按日期统计查询
- Adsense关键词价格查询
- google关键词查询
- 关键词:ASP 多重查询
- VS2010上的OpenCV的版本选择与配置
- JAVA 中 Redis与ehcache对比与使用
- LeetCode#58. Length of Last Word
- Linux 下三种方式设置环境变量
- bom操作
- ElasticSearchDSL查询模板之一(按日查询与按关键词聚类)
- eclipse导入项目报错
- 数值方法——资料
- json格式解析——入门
- 06-maven 初始化配置: 配置maven本地环境 settings.xml
- GTD软件比较和选用
- 问题 E: 机器设备
- 【腾讯云的1001种玩法】从购买服务器到建站,从0打造自己的网络领地
- retorfit2+okhttp3文件上传下载