es 聚合统计

最新项目做ES 统计 就分享一下:
直接上代码
修改完善了下,1.统计数据只取10条分页问题,数据查询只取10000条问题
需要将es 修改下:

da/_settings/put
{"max_result_window":200000000}
	// 高级检索,根据字段来搜索
	@Override
	public Page<DaDab> esByParam(EsSearchDto esSearchDto) {

		String index = esSearchDto.getIndex();
		List<Map<String, Object>> list = new ArrayList<>();
		Page<DaDab> DaDabPage = new Page<>();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);

			List<Integer> mlids = esSearchDto.getMlids();
			//保存期限
			String bcqx = esSearchDto.getBcqx();
			//创建时间
			String cjsj = esSearchDto.getCjsj();
			//部门
			Integer deptId = esSearchDto.getDeptId();
			//档案密级
			String damj = esSearchDto.getDamj();
			//归档时间
			String gdsj = esSearchDto.getGdsj();

			List<String> dabhs = esSearchDto.getDabhs();

			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);

			//保存期限
			if (StringUtils.isNotBlank(bcqx)) {
				boolQueryBuilder.must(QueryBuilders.termQuery("bcqx.keyword", bcqx));
			}
			// cjsj  (2021-01-01)
			if (StringUtils.isNotBlank(cjsj)) {
				String from = cjsj + " 00:00:00";
				String to = cjsj + " 23:59:59";
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj.keyword").gte(from).lte(to);
				boolQueryBuilder.must(rangequerybuilder);
			}
			// deptId
			if (deptId != null) {
				boolQueryBuilder.must(QueryBuilders.termQuery("deptId", deptId));
			}
			// damj
			if (StringUtils.isNotBlank(damj)) {
				boolQueryBuilder.must(QueryBuilders.termQuery("damj.keyword", damj));
			}
			// gdsj 因为归档时间存的是 long 格式 所以需要转化
			if (StringUtils.isNotBlank(gdsj)) {
//				long time = DateUtil.parse(gdsj).getTime();
//				boolQueryBuilder.must(QueryBuilders.termQuery("gdsj", time));

				String from = gdsj + " 00:00:00";
				String to = gdsj + " 23:59:59";
				long ftime = DateUtil.parse(from).getTime();
				long ttime = DateUtil.parse(to).getTime();
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("gdsj").gte(ftime).lte(ttime);
				boolQueryBuilder.must(rangequerybuilder);
			}

			if (mlids != null && mlids.size() > 0) {
				BoolQueryBuilder mlboolQueryBuilder = boolQuery();
				// 精致查询
				mlids.forEach(mlid ->{
					mlboolQueryBuilder.should(QueryBuilders.termQuery("mlid.keyword", mlid));
				});
				boolQueryBuilder.must(mlboolQueryBuilder);
			}
			if (dabhs != null && dabhs.size() > 0) {
				BoolQueryBuilder dabhboolQB = boolQuery();
				// 精致查询
				dabhs.forEach(dabh ->{
					dabhboolQB.should(QueryBuilders.termQuery("dabh.keyword", dabh));
				});
				boolQueryBuilder.must(dabhboolQB);
			}
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
			Integer offset = (esSearchDto.getPageNo() - 1) * esSearchDto.getPageSize();
			searchSourceBuilder.from(offset);
			searchSourceBuilder.size(esSearchDto.getPageSize());
			searchSourceBuilder.trackTotalHits(true);
			// 执行搜索
			request.source(searchSourceBuilder);
			// client执行
			SearchResponse search = client.search(request, RequestOptions.DEFAULT);
			SearchHits hits = search.getHits();
			// 获取检索结果总数
			int count = (int) hits.getTotalHits().value;

			DaDabPage.setTotal(count);
			if (count != 0) {
				for (SearchHit hit : hits.getHits()) {
					Map<String, Object> sourceAsMap = hit.getSourceAsMap();
					list.add(sourceAsMap);
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		DaDabPage.setRecords(formatBean(list));
		return DaDabPage;
	}
	
	@Override
	public List<Map> esTjByBcqxAndMl(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}
			//保存期限
			if (StringUtils.isNotBlank(esSearchDto.getBcqx())) {
				// 精准查询
				TermQueryBuilder termQueryBuilder2 = QueryBuilders.termQuery("bcqx", esSearchDto.getBcqx());
				boolQueryBuilder.must(termQueryBuilder2);
			}
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
			// 解决统计分页问题,取100条 可以设置更大
			TermsAggregationBuilder termsBuilder2 = AggregationBuilders.terms("bcqxsum").field("bcqxmc.keyword").size(100);
			TermsAggregationBuilder termsBuilder1 = AggregationBuilders.terms("mlsum").field("mlmc.keyword").size(100);
			termsBuilder2.subAggregation(termsBuilder1);

			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Terms terms = response.getAggregations().get("bcqxsum");
			for (Terms.Bucket buck : terms.getBuckets()) {
				String bcqxmc = buck.getKeyAsString();
				Terms mlsum = buck.getAggregations().get("mlsum");
				for (Terms.Bucket mlbuck : mlsum.getBuckets()) {
					HashMap<String, Object> map = new HashMap<>(16);
					String mlmc = mlbuck.getKeyAsString();
					long num = mlbuck.getDocCount();
					map.put("bcqxmc", bcqxmc);
					map.put("mlmc", mlmc);
					map.put("num", num);
					list.add(map);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esDaTjByGdsjAndMl(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}

			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

			DateHistogramAggregationBuilder termsBuilder2 = AggregationBuilders.dateHistogram("gdsjsum")
					.field("gdsj").dateHistogramInterval(DateHistogramInterval.YEAR);
			//termsBuilder2.format("yyyy");
			TermsAggregationBuilder termsBuilder1 = AggregationBuilders.terms("mlsum").field("mlmc.keyword").size(100);
			termsBuilder2.subAggregation(termsBuilder1);

			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Histogram terms = response.getAggregations().get("gdsjsum");
			for (Histogram.Bucket buck : terms.getBuckets()) {
				String gdsj = buck.getKeyAsString();
				DateTime time = DateUtil.date(new Long(gdsj));
				Terms mlsum = buck.getAggregations().get("mlsum");
				for (Terms.Bucket mlbuck : mlsum.getBuckets()) {
					HashMap<String, Object> map = new HashMap<>(16);
					String mlmc = mlbuck.getKeyAsString();
					long num = mlbuck.getDocCount();
					map.put("year", time.year());
					map.put("mlmc", mlmc);
					map.put("num", num);
					list.add(map);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esDaTjByGdsj(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}

			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

			DateHistogramAggregationBuilder termsBuilder2 = AggregationBuilders.dateHistogram("gdsjsum")
					.field("gdsj").dateHistogramInterval(DateHistogramInterval.YEAR);

			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Histogram terms = (Histogram) response.getAggregations().get("gdsjsum");
			for (Histogram.Bucket buck : terms.getBuckets()) {
				String gdsj = buck.getKeyAsString();
				DateTime time = DateUtil.date(new Long(gdsj));
				HashMap<String, Object> map = new HashMap<>(16);
				long num = buck.getDocCount();
				map.put("year", time.year());
				map.put("num", num);
				list.add(map);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esYwgsTjByMl(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}
			//保存期限
			if (StringUtils.isNotBlank(esSearchDto.getYwgs())) {
				// 精准查询
				TermQueryBuilder termQueryBuilder2 = QueryBuilders.termQuery("ywgs", esSearchDto.getYwgs());
				boolQueryBuilder.must(termQueryBuilder2);
			}
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

			TermsAggregationBuilder termsBuilder2 = AggregationBuilders.terms("ywgssum").field("ywgs.keyword").size(100);
			TermsAggregationBuilder termsBuilder1 = AggregationBuilders.terms("mlsum").field("mlmc.keyword").size(100);
			termsBuilder2.subAggregation(termsBuilder1);

			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Terms terms = response.getAggregations().get("ywgssum");
			for (Terms.Bucket buck : terms.getBuckets()) {
				String ywgs = buck.getKeyAsString();
				Terms mlsum = buck.getAggregations().get("mlsum");
				for (Terms.Bucket mlbuck : mlsum.getBuckets()) {
					HashMap<String, Object> map = new HashMap<>(16);
					String mlmc = mlbuck.getKeyAsString();
					long num = mlbuck.getDocCount();
					map.put("ywgs", ywgs);
					map.put("mlmc", mlmc);
					map.put("num", num);
					list.add(map);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esdagdTjByMl(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder1 = QueryBuilders.termQuery("sfsc", 0);
			TermQueryBuilder termQueryBuilder2 = QueryBuilders.termQuery("dazt", 10);
			boolQueryBuilder.must(termQueryBuilder1);
			boolQueryBuilder.must(termQueryBuilder2);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}

			TermsAggregationBuilder termsBuilder = AggregationBuilders.terms("sum").field("mlmc.keyword").size(100);
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
			searchSourceBuilder.aggregation(termsBuilder);
			// 执行搜索
			request.source(searchSourceBuilder);
			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);
			// 获取统计后数据
			Terms terms = response.getAggregations().get("sum");

			for (int i = 0; i < terms.getBuckets().size(); i++) {
				HashMap<String, Object> map = new HashMap<>(16);
				// mlmc
				String mlmc = terms.getBuckets().get(i).getKey().toString();
				//数量
				Long sum = terms.getBuckets().get(i).getDocCount();
				map.put("mlmc", mlmc);
				map.put("num", sum.intValue());
				list.add(map);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esDaTjByCjrAndMl(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder1 = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder1);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}
			if (StringUtils.isNotBlank(esSearchDto.getCjrmc())) {
				boolQueryBuilder.must(QueryBuilders.termQuery("cjrmc.keyword", esSearchDto.getCjrmc()));
			}
			TermsAggregationBuilder termsBuilder2 = AggregationBuilders.terms("cjrsum").field("cjrmc.keyword").size(999);
			TermsAggregationBuilder termsBuilder1 = AggregationBuilders.terms("mlsum").field("mlmc.keyword").size(999);
			termsBuilder2.subAggregation(termsBuilder1);

			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Terms terms = response.getAggregations().get("cjrsum");
			for (Terms.Bucket buck : terms.getBuckets()) {
				String cjr = buck.getKeyAsString();
				Terms mlsum = buck.getAggregations().get("mlsum");
				for (Terms.Bucket mlbuck : mlsum.getBuckets()) {
					HashMap<String, Object> map = new HashMap<>(16);
					String mlmc = mlbuck.getKeyAsString();
					long num = mlbuck.getDocCount();
					map.put("cjr", cjr);
					map.put("mlmc", mlmc);
					map.put("num", num);
					list.add(map);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esDaTjByCjr(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder1 = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder1);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}
			TermsAggregationBuilder termsBuilder2 = AggregationBuilders.terms("cjrsum").field("cjrmc.keyword").size(999);
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Terms terms = response.getAggregations().get("cjrsum");

			for (Terms.Bucket buck : terms.getBuckets()) {
				String cjr = buck.getKeyAsString();
				HashMap<String, Object> map = new HashMap<>(16);
				long num = buck.getDocCount();
				map.put("cjr", cjr);
				map.put("num", num);
				list.add(map);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<String> esDaByZt(String dazt) {
		List<String> list = new ArrayList<>();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices("da");
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			boolQueryBuilder.must(QueryBuilders.termQuery("sfsc", 0))
					.must(QueryBuilders.termQuery("dazt", Integer.parseInt(dazt)));
			searchSourceBuilder.fetchSource("dabh","");
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.trackTotalHits(true);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
			// 执行搜索
			request.source(searchSourceBuilder);

			SearchResponse search = client.search(request, RequestOptions.DEFAULT);
			SearchHits hits = search.getHits();
			// 获取检索结果总数
			int count = (int) hits.getTotalHits().value;

			if (count != 0) {
				for (SearchHit hit : hits.getHits()) {
					String sourceAsMap = hit.getSourceAsString();
					list.add(sourceAsMap);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esDaTjByYwgs(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder1 = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder1);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}

			TermsAggregationBuilder termsBuilder = AggregationBuilders.terms("sum").field("ywgs.keyword").size(100);
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
			searchSourceBuilder.aggregation(termsBuilder);
			// 执行搜索
			request.source(searchSourceBuilder);
			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);
			// 获取统计后数据
			Terms terms = response.getAggregations().get("sum");

			for (int i = 0; i < terms.getBuckets().size(); i++) {
				HashMap<String, Object> map = new HashMap<>(16);
				// ywgs
				String ywgs = terms.getBuckets().get(i).getKey().toString();
				//数量
				Long sum = terms.getBuckets().get(i).getDocCount();
				map.put("ywgs", ywgs);
				map.put("num", sum.intValue());
				list.add(map);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public List<Map> esTjByBcqx(EsSearchDto esSearchDto) {
		List<Map> list = new ArrayList<>();
		String index = esSearchDto.getIndex();
		try {
			SearchRequest request = new SearchRequest();
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			request.indices(index);
			// 多字段模糊条件
			BoolQueryBuilder boolQueryBuilder = boolQuery();
			// 必须条件 精准查询
			TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sfsc", 0);
			boolQueryBuilder.must(termQueryBuilder);
			//开始结束时间
			if (StrUtil.isNotEmpty(esSearchDto.getStartTime()) && StrUtil.isNotEmpty(esSearchDto.getEndTime())) {
				RangeQueryBuilder rangequerybuilder = QueryBuilders
						//传入时间,目标格式2020-01-02T03:17:37.638Z
						.rangeQuery("cjsj")
						.from(esSearchDto.getStartTime()).to(esSearchDto.getEndTime());
				boolQueryBuilder.must(rangequerybuilder);
			}
			searchSourceBuilder.query(boolQueryBuilder);
			searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

			TermsAggregationBuilder termsBuilder2 = AggregationBuilders.terms("bcqxsum").field("bcqxmc.keyword").size(100);
			searchSourceBuilder.aggregation(termsBuilder2);
			// 执行搜索
			request.source(searchSourceBuilder);

			// client执行
			SearchResponse response = client.search(request, RequestOptions.DEFAULT);

			// 获取统计后数据
			Terms terms = response.getAggregations().get("bcqxsum");
			for (Terms.Bucket buck : terms.getBuckets()) {
				HashMap<String, Object> map = new HashMap<>(16);
				String bcqxmc = buck.getKeyAsString();
				long num = buck.getDocCount();
				map.put("bcqxmc", bcqxmc);
				map.put("num", num);
				list.add(map);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 中,可以使用聚合(Aggregation)实现对文档进行聚合统计,其中包括出现次数的统计。下面是一个示例: 假设我们有一个名为 "sales" 的索引,包含以下文档: ``` { "product": "A", "price": 10.0, "timestamp": "2021-08-01T10:00:00Z" } { "product": "B", "price": 15.0, "timestamp": "2021-08-01T10:05:00Z" } { "product": "A", "price": 12.0, "timestamp": "2021-08-01T10:10:00Z" } { "product": "C", "price": 20.0, "timestamp": "2021-08-01T10:15:00Z" } { "product": "A", "price": 8.0, "timestamp": "2021-08-01T10:20:00Z" } { "product": "B", "price": 18.0, "timestamp": "2021-08-01T10:25:00Z" } ``` 现在,我们想要统计每个产品出现的次数,可以使用以下聚合查询: ``` { "aggs": { "products": { "terms": { "field": "product" } } } } ``` 其中,"aggs" 是聚合查询的关键字,"products" 是我们给这个聚合起的名字,"terms" 表示我们要按照某个字段进行分组,"field" 指定了我们要按照哪个字段进行分组。 运行上述查询后,得到的结果如下: ``` { "aggregations": { "products": { "buckets": [ { "key": "A", "doc_count": 3 }, { "key": "B", "doc_count": 2 }, { "key": "C", "doc_count": 1 } ] } } } ``` 其中,"key" 表示产品名称,"doc_count" 表示该产品出现的次数。 如果想要对出现次数进行排序,可以使用以下聚合查询: ``` { "aggs": { "products": { "terms": { "field": "product", "order": { "_count": "desc" } } } } } ``` 其中,"order" 表示按照什么字段进行排序,"_count" 表示按照出现次数进行排序,"desc" 表示降序排列。 运行上述查询后,得到的结果如下: ``` { "aggregations": { "products": { "buckets": [ { "key": "A", "doc_count": 3 }, { "key": "B", "doc_count": 2 }, { "key": "C", "doc_count": 1 } ] } } } ``` 其中,产品 A 出现的次数最多,排在第一位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值