AggregationBuilders.terms:一段时间内,某个字段取值的数量排名前几的聚合

/ **   @param startTime 开始的时间* @param endTime 结束的时间* @param termAggName term过滤* @param fieldName 要做count的字段* @param top 返回的数量*/
RangeQueryBuilder actionPeriod = QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second");
TermsBuilder termsBuilder = AggregationBuilders.terms(termAggName).field(fieldName).size(top).order(Terms.Order.count(false));
return client.prepareSearch(INDICE).setQuery(actionPeriod).addAggregation(termsBuilder).setSize(0).execute().actionGet();
复制代码

order(Terms.Order.count(false)):表示降序

size(top):top表示只要排序的数量

prepareSearch(INDICE):INDICE表示索引的名字

setSize(0):表示只要聚合结果

如果需要去掉某些特殊字段取值 client为构建的ES客户端

 BoolQueryBuilder actionPeriodMustNot = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).mustNot(QueryBuilders.termQuery(field, value));
复制代码

如果是单个字段特定的多个值

//values是个List
BoolQueryBuilder actioPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).must(QueryBuilders.termsQuery(field, values));
复制代码

使用结果

Terms clickCount= sr.getAggregations().get(termAggName);
for (Terms.Bucket term:clickCount.getBuckets()){int key = term.getKeyAsNumber().intValue(); //要排序字段的值long docCount = term.getDocCount(); //数量
}
复制代码

date_histogram: 一段时间之内,时间字段按照时间间隔的聚合

BoolQueryBuilder actioPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second"));
DateHistogramBuilder actionInterval = AggregationBuilders.dateHistogram(dateNickName).field("myTimeField").timeZone("Asia/Shanghai");
if (timeInterval<MINUTE){actionTimeInterval.interval(DateHistogramInterval.seconds(timeInterval)).format("HH:mm:ss");
}else if (timeInterval<HOUR){actionTimeInterval.interval(DateHistogramInterval.minutes(timeInterval / MINUTE)).format("dd HH:mm");
}else if (timeInterval < DAY){actionTimeInterval.interval(DateHistogramInterval.hours(timeInterval / HOUR)).format("HH:mm");
}else if (timeInterval < THIRTY_DAY){actionTimeInterval.interval(DateHistogramInterval.days(timeInterval / DAY));
}else{actionTimeInterval.interval(DateHistogramInterval.MONTH);
}
actionInterval.format("yyyy-MM-dd HH:mm:ssZ");
return client.prepareSearch(INDICE).setQuery(actioPeriodMust).addAggregation(actionInterval).setSize(0).execute().actionGet();
复制代码

es本身默认设置的时间戳是 UTC形式,在国内要设置TimeZone(“Asia/Shanghai”);

java的SimpleDateFormate会默认获取虚拟机所在时区的时间戳,所以存时间的时候,最好存与时区无关的时间,再做本地化显示

使用结果

Histogram histogram=sr.getAggregations().get(dateNickName);
for(Histogram.Bucket entry:histogram.getBuckets()){String key = entry.getKeyAsString();//时间间隔long count = entry.getDocCount();//数量
}
复制代码

subAggregation:一段时间内,按照一定的时间间隔,每个间隔段内字段每个取值的数量聚合

相当于合并上述两个场景

BoolQueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).must(QueryBuilders.termsQuery("action", orderValue));
DateHistogramBuilder actionTimeInterval = AggregationBuilders.dateHistogram(dateNickName).field("myTimeField").timeZone("Asia/Shanghai");
actionTimeInterval.subAggregation(AggregationBuilders.terms(termNickName).field("action").size(size));
return client.prepareSearch(INDICE).setQuery(query).addAggregation(actionTimeInterval).setSize(0).execute().actionGet();
复制代码

使用结果

Histogram hitogram = sr.getAggregations().get(dateAggName);
for (Histogram.Bucket date : hitogram.getBuckets()) {String intervalName = date.getKeyAsString();long timeIntervalCount = date.getDocCount();if (timeIntervalCount != 0) {Terms terms = date.getAggregations().get(termAggName);for (Terms.Bucket entry : terms.getBuckets()) {int key=    entry.getKeyAsNumber().intValue();long childCount = entry.getDocCount();}}
}
复制代码

分页获取数据

BoolQueryBuilder actionPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.termQuery(key, value)).must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second"));
return client.prepareSearch(INDICE).setQuery(actionPeriodMust).addSort(SortBuilders.fieldSort("myTimeField").order(SortOrder.ASC)).setFrom(from).setSize(size).execute().actionGet();
复制代码

使用

Iterator<SearchHit> iterator = sr.getHits().iterator();
while (iterator.hasNext()) {SearchHit next = iterator.next();JSONObject jo = JSONObject.parseObject(next.getSourceAsString());
}
复制代码

AggregationBuilders.cardinality:获取某个字段的唯一取值数量

BoolQueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTimeInSec*1000).lte(endTimeInSec*1000).format("epoch_millis"));
CardinalityBuilder fieldCardinality = AggregationBuilders.cardinality(cardinalityAggName).field(field);//field 要获取的字段
return client.prepareSearch(INDICE).setQuery(query).addAggregation(fieldCardinality).execute().actionGet();
复制代码

使用结果

Cardinality cardinality = sr.getAggregations().get(cardinalityAggName);
long value = cardinality.getValue();
复制代码

bool查询

比如想要addr是beijing的,同时必须满足条件:name是 paxi,或者,phoneNumber是 1234567890

BoolQueryBuilder searchIdQuery = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
while (kvs.hasNext()){Map.Entry<String, String> fieldValue = kvs.next();String field=fieldValue.getKey();String value=fieldValue.getValue();searchIdQuery.should(QueryBuilders.termQuery(field, value));
}
boolQueryBuilder.must(searchIdQuery);
boolQueryBuilder.must(QueryBuilders.termsQuery(key, values));
return client.prepareSearch(INDICE).setQuery(boolQueryBuilder).execute().actionGet();
复制代码

java api使用ElastichSearch指南相关推荐

  1. Elasticsearch Java API 6.2(java client)

    前言 本节描述了Elasticsearch提供的Java API,所有的Elasticsearch操作都使用客户端对象执行,所有操作本质上都是完全异步的(要么接收监听器,要么未来返回). 此外,客户端 ...

  2. java开发checklist,Java API设计CheckList

    API设计原则:正确.好名.易用.易学.够快.够小.但我们从来不缺原则,〜〜〜 Interface 1.The Importance of Being Use Case Oriented,一个接口应当 ...

  3. Java 7 并发编程指南

    原文是发表在并发编程网上翻译后的 <Java 7 并发编程指南>,这里对其中的目录做个更加详细的描述,并且写出了重点说明,方便日后快速查阅.建议仔细查看每节的代码实现,非常具有参考价值.可 ...

  4. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]

    Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...

  5. 有点长的 Java API 设计清单

    在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度.就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程 ...

  6. Java API 设计清单

    为什么80%的码农都做不了架构师?>>>    在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度.就像飞行员起飞 ...

  7. java接口fastjson_走进Java接口测试之fastjson指南

    来源:https://www.testwo.com 走进Java接口测试之fastjson指南s1.jpeg (147.9 KB, 下载次数: 0) 2020-10-5 23:59 上传 引言 在上文 ...

  8. EWS Java API 的基本使用

    2018/12/20 更新: 这篇文章的同步方式存在缺陷,在仔细研究Exchange后有不少新的收获,找到了更好的解决方案,请移步这里观看~ Exchange 会议同步入门指南 需求功能 最近公司接到 ...

  9. java chrome 控制台_[Java教程]Chrome 控制台指南

    [Java教程]Chrome 控制台指南 0 2014-09-16 20:01:07 转自:http://blog.jobbole.com/76985/ Chrome的开发者工具已经强大到没朋友的地步 ...

最新文章

  1. 为什么不记录慢速查询?
  2. 如何在Git中克隆单个分支?
  3. ystem.Windows.Forms.SplitContainer : ContainerControl, ISupportInitialize
  4. MVC下实现LayUI分页的Demo
  5. h.264 去块滤波
  6. 手把手教你如何下载大厂页面的字体——开发
  7. Makefile:Makefile中的调试打印方法
  8. HTM皮质学习算法资料
  9. Web 前端编程运维必备
  10. '__pendingCallbacks[...].async' is null or not an object
  11. 自动驾驶 10-3: 全球导航卫星系统 (GNSS)The Global Navigation Satellite Systems
  12. 初探腾讯云物联网开发平台loT
  13. Selenium批量下载抖音无水印高清视频
  14. STM32按键总结(低电平有效及上升沿有效)
  15. mysql运维备份_MySQL运维经验
  16. 离散数学常用符号TeX输入
  17. 教学优化算法的简单介绍
  18. 常用m3u8,rtsp,rtmp,flv,mp4直播流在线测试地址
  19. Android“FakeID”签名漏洞分析和利用
  20. 空心字母金字塔 (10 分)

热门文章

  1. linux 深度v15,[转载]深度Linux发布 V15.9
  2. linux系统基础与应用,Linux操作系统:基础、原理与应用
  3. 全排列变种:限定 排列的差值范围 及 排列中的元素个数
  4. C++:38---final关键字和禁止类继承
  5. (二十二)深入浅出TCPIP之实战篇—用c++开发一个http服务器
  6. Python(24)-面向对象3-可迭代类对象Pokemon
  7. multism中ui和uo应该怎么表示_王者荣耀:梦泪直播时谈到体验服大改动,表示装备的改动很关键...
  8. public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...
  9. Java基础——Java IO详解
  10. A饭福利,AMD Mantle API获众多游戏开发商青睐!