ElasticSearch ES+java常用查询语句

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 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 map = hit.getSourceAsMap();//可以转化成map再对操作数据
				System.out.println("article get="+hit.getSourceAsString());
				System.out.println("vin = "+hit.getSourceAsMap().get("vin"));
			}

 

你可能感兴趣的:(elasticsearch)