博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java api使用ElastichSearch指南
阅读量:6717 次
发布时间:2019-06-25

本文共 4887 字,大约阅读时间需要 16 分钟。

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是个ListBoolQueryBuilder 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

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
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
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();复制代码

转载地址:http://tnumo.baihongyu.com/

你可能感兴趣的文章
《编程原本 》一1.3 对象
查看>>
行业展望:数据中心策略和调整业务
查看>>
Facebook抄袭Snap真的十恶不赦吗?
查看>>
AUTO_INCREMENT列在InnoDB里如何工作
查看>>
外勤365:提升企业线下销售效率,成就移动外勤首选品牌
查看>>
防范网络犯罪组合拳 警企合作是关键
查看>>
黑客入侵好莱坞越发失控 黑客组织高调发声明威胁
查看>>
结合重复数据删除和Rowhammer的攻击怎么解?
查看>>
携手美国糖尿病协会,IBM将用大数据改变糖尿病的未来
查看>>
再续 asp.net 域名欺骗式开发之泛解析域名
查看>>
先是山寨后是烂大街 联发科的症结在哪?
查看>>
Snapchat升级聊天功能:增加贴纸、语音和视频
查看>>
5000万美元融资构建产业链!EasyStack深耕开源云
查看>>
因为你没加密 所以网络保险不给你理赔
查看>>
iOS零日漏洞赏金已升至150万美元
查看>>
印媒:中国厂商势头强劲 索尼三星在印度裁员
查看>>
苹果不再披露广告支出 或为掩饰销售额背后的支出增长
查看>>
中国太阳能续增 补贴、技术转型均受重视
查看>>
北京信息化协会人工智能专委会成立 AI产业快速腾飞
查看>>
《PostgreSQL服务器编程》一一1.9 关于缓存
查看>>