ElasticSearch ES+java常用查询语句

本文介绍如何在Elasticsearch中使用Java进行高效的数据查询,包括分组查询、去重统计及结果排序的方法。通过具体代码示例展示了如何设置查询条件、排序方式以及如何获取特定字段的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"));
			}

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值