elasticsearch 查询API
Transport Client
Client的连接方式可以参考我的前两篇文章。
本次操作以TransportClient的Java API 查询操作。
public void testTransportClient() { Map<String, Object> params = new HashMap<>(); String endtmStart = "2019-03-07 00:00"; String endtmEnd = "2019-03-09 23:59"; String removezonecode = "852RA"; String[] array = new String[]{"a","b"}; //查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders .boolQuery() //字段匹配 .must(QueryBuilders.termQuery("removezonecode", removezonecode)) //匹配多个值 .must(QueryBuilders.termsQuery("removezonecode", array)) // 范围 .must(new RangeQueryBuilder("endtm").gte(endtmStart).lte(endtmEnd)); boolQueryBuilder.must(new RangeQueryBuilder("endtm").gte(endtmStart).lte(endtmEnd)); TransportClient client = TransportClientFactory.getInstance().getTransportClient(); SearchSourceBuilder ssb = new SearchSourceBuilder(); SearchResponse searchResponse = client .prepareSearch(esIndexName).setSearchType(SearchType.DEFAULT) .setSize(5).setQuery(boolQueryBuilder).execute() .actionGet(); // System.out.println(searchResponse.getHits().totalHits); for (SearchHit searchHit : searchResponse.getHits()) { String jsonStr = searchHit.getSourceAsString(); System.out.println(jsonStr); } }
Rest Client
本次操作以RestClient的Java API 查询操作
public void testRestHighClient() { String endtmStart = "2019-03-07 00:00"; String endtmEnd = "2019-03-09 23:59"; String removezonecode = "852RA"; String[] array = new String[]{"a","b"}; //条件查找 BoolQueryBuilder boolQueryBuilder = QueryBuilders .boolQuery() //字段匹配 .must(QueryBuilders.termQuery("removezonecode", removezonecode)) //匹配多个值 .must(QueryBuilders.termsQuery("removezonecode", array)) // 范围 .must(new RangeQueryBuilder("endtm").gte(endtmStart).lte(endtmEnd)); //聚合 AggregationBuilder tb1 = AggregationBuilders.terms("src_dist_code_list").field("src_dist_code").size(10000); TermsAggregationBuilder tb2 = AggregationBuilders.terms("dest_area_code_list").field("dest_area_code").size(10000); TermsAggregationBuilder tb3 = AggregationBuilders.terms("src_city_code_list").field("src_city_code").size(10000); SumAggregationBuilder tbSum = AggregationBuilders.sum("meterage_weight_qty_sum").field("meterage_weight_qty"); tb3.subAggregation(tbSum); tb2.subAggregation(tb3); tb1.subAggregation(tb2); SearchSourceBuilder ssb = new SearchSourceBuilder(); ssb.query(boolQueryBuilder); ssb.aggregation(tb1); //查询请求 SearchRequest sr = new SearchRequest(); sr.indices(esIndexName); sr.source(ssb); System.out.println(sr.source()); RestHighLevelClient client = RestHighLevelClientFactory.getInstance().getHighLevelClient(); try { SearchResponse response = client.search(sr); System.out.println(response.getHits().getTotalHits()); for (SearchHit searchHit : response.getHits().getHits()) { String jsonStr = searchHit.getSourceAsString(); System.out.println(jsonStr); } RestHighLevelClientFactory.getInstance().close(); } catch (IOException e) { e.printStackTrace(); } }
【深度分页问题】
在使用查询的时候会设置size,但是由于ES本身的限制,如果查询超过10000条数据,可能会查不出来。报 Result window is too large 的错误。
解决:
1.增大max_result_window的值,最大值受服务器配置的限制
2.使用scroll分页
解决参考:
https://blog.csdn.net/lisongjia123/article/details/79041402