学习笔记-ES 7.7.1 JavaAPI多条件数量查询
@Test
public void testTiaoSercha() throws IOException {
//按索引查找
SearchRequest searchRequest = new SearchRequest("lyry");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//使用布尔查询实现多条件查询
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//查询条件
queryBuilder.must(QueryBuilders.matchQuery("cfd","运城市"));
queryBuilder.must(QueryBuilders.matchQuery("mdd","唐山市"));
//查询条数
searchSourceBuilder.size(10000);
//searchSourceBuilder 加入查询方法
searchSourceBuilder.query(queryBuilder);
//searchRequest 加入 searchSourceBuilder
searchRequest.source(searchSourceBuilder);
//客户端开始查询
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//查询到结果
SearchHits hits = searchResponse.getHits();
// 使用迭代器进行迭代
Iterator<SearchHit> iterator = hits.iterator();
//开始迭代
while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每个查询对象
System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印
}
//答应条数
System.out.println(hits.getTotalHits());
}
下面是聚合查询
//计算个个分支的人数
@Test
public void testCountMan() throws IOException {
CountRequest request=new CountRequest("lyry");
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("cfd", "运城市");
searchSourceBuilder.query(matchQueryBuilder);
request.source(searchSourceBuilder);
CountResponse search = client.count(request, RequestOptions.DEFAULT);
System.out.println("运城市出城人数:"+search.getCount());
}
//查询出行方式人数
@Test
public void testJvHeSelect() throws IOException {
SearchRequest searchRequest =new SearchRequest("zdryyj");
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//设置超时时间
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("by_dtxx").field("dtxx");
sourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
Map<String, Aggregation> stringAggregationMap = aggregations.asMap();
//处理String类型的字段,以进行序列化
ParsedStringTerms by_dtxx = (ParsedStringTerms)stringAggregationMap.get("by_dtxx");
List<? extends Terms.Bucket> buckets = by_dtxx.getBuckets();
//拿到总人数 ----Stream流求和
long sum = buckets.stream().map(Terms.Bucket::getDocCount).reduce(Long::sum).get();
BigDecimal count = new BigDecimal(sum);
Map<String, Object> temp = new HashMap<>(2);;
for (Terms.Bucket bucket : buckets) {
//分类人数
BigDecimal bigDecimal = new BigDecimal(bucket.getDocCount());
temp.put("name", bucket.getKeyAsString());
temp.put("count", bigDecimal);
System.out.println("出行方式:"+temp.get("name")+"人数:"+temp.get("count"));
}
System.out.println("总人数"+count);
}
//航空出行对象总数
@Test
public void testHangKong() throws IOException {
SearchRequest searchRequest =new SearchRequest("hkgpxx");
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//设置超时时间
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("b1_guanlian").field("hbh");
TermsAggregationBuilder termsAggregationBuilder1 = AggregationBuilders.terms("b2_guanlian").field("hbh");
sourceBuilder.aggregation(termsAggregationBuilder.subAggregation(termsAggregationBuilder1));
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedStringTerms b1_guanlian =(ParsedStringTerms) aggregations.getAsMap().get("b1_guanlian");
List<? extends Terms.Bucket> buckets = b1_guanlian.getBuckets();
for (Terms.Bucket bucket:buckets) {
BigDecimal bigDecimal = new BigDecimal(bucket.getDocCount());
Map<String, Object> temp = new HashMap<>(2);
temp.put("name", bucket.getKey());
System.out.println(temp.get("name"));
}
}