elasticsearch用JAVA 查询数据太多,一次性返回数据有限制,
用车架号分组返回数据的时候,一直误认为.setFrom(0).setSize(100)就是查询返回的数据,这样的语句在单查询的时候没有问题,但是在addAggregation中,或者分组查询等情况下,根本没有效果,必须在addAggregation 返回数据前加上要取多少条记录
如addAggregation(AggregationBuilders.terms(“vinGroup”).field(“vin.keyword”).size(20)).get();才有效
下面是查询分组的JAVA代码 ,还有去重复的方法cardinality使用方式,
//查询过滤范围,注意, elasticsearch里面的字段全部是小写,分组查询按最大值最小值差计算每辆车在时间段里跑的公里数,
//按照总公里数排序,去除重复数据等功能
@Test
public void queryFilterMaxMin(){
QueryBuilder queryrang = QueryBuilders.rangeQuery("createtime").gt("2018-01-01").lt("2018-08-30");//过滤查询( gt大于) (lt小于)
@SuppressWarnings("rawtypes")
SortBuilder sortBuilder=SortBuilders.fieldSort("totaldistance");//排序
sortBuilder.order(SortOrder.DESC);
//查询总里程不能等于空
QueryBuilder query1 = QueryBuilders.boolQuery()
.must(QueryBuilders.existsQuery("totaldistance")) //字段为空的判断方式 existsQuery,表示存在值或不存在值,由must和mustNot
.filter(queryrang);
SearchResponse search = client.prepareSearch("ims_tsp_completecondition_index")
.setQuery(query1).addAggregation(AggregationBuilders.terms("vinGroup").field("vin.keyword")
.subAggregation(AggregationBuilders.max("maxtotaldistance").field("totaldistance"))
.subAggregation(AggregationBuilders.min("mintotaldistance").field("totaldistance")).size(20))//分组后面加返回数据条数
.addSort(sortBuilder)
//.setFrom(0).setSize(100)//默认返回10个桶,此参数设置其实是无效,仅仅是分页参数
.get();
Terms terms = search.getAggregations().get("vinGroup");
for(Terms.Bucket tm:terms.getBuckets()){
Map<String, Aggregation> map = tm.getAggregations().getAsMap();
Max max = (InternalMax)map.get("maxtotaldistance");
Min min = (InternalMin)map.get("mintotaldistance");
System.out.println("max-min: "+(max.getValue()-min.getValue())+" vin: "+tm.getKey()+" max: "+max.getValue()+" min: "+min.getValue()+" doc_count:"+tm.getDocCount());
}
//Cardinality 去除重复数据 ,统计总数
SearchResponse sr = client.prepareSearch("ims_tsp_completecondition_index")
.addAggregation(AggregationBuilders.cardinality("type_count").field("vin.keyword")).execute().actionGet();
Cardinality result = sr.getAggregations().get("type_count");
System.out.println("type_count: "+result.getValue());
client.close();
}
下面代码是查询,没有分组,并且按指定字段返回数据,
查询单个编号的15条数据,给出指定取回的参数字段setFetchSource,有两个参数,第一个是包含要取出的字段,第二个参数是排队哪些字段
QueryBuilder query = QueryBuilders.matchQuery("vin","LEFYECG20JHN19938");//LEFYECG20JHN19938 沪BZS601
//搜索数据
SearchResponse serResponse = client.prepareSearch("ims_tsp_completecondition_index")
.setQuery(query)
.setFetchSource(new String[]{"platelicenseno","longitude","latitude","totaldistance"}, null)//includes 第一个参数是包括要展示的参数,excludes第二个是要排除的参数
.setFrom(0)
.setSize(15)
.execute().actionGet();
SearchHits hits = serResponse.getHits();
for(SearchHit hit:hits){
Map<String, Object> map = hit.getSourceAsMap();//可以转化成map再对操作数据
System.out.println("article get="+hit.getSourceAsString());
System.out.println("vin = "+hit.getSourceAsMap().get("vin"));
}