// 高亮查询 SearchResponse<Test> response9 = client.search(s -> s .index("newapi") .query(q -> q .term(t -> t .field("name") .value("wangwu") ) ) .highlight(h -> h .fields("name", f -> f .preTags("<font color='red'>") .postTags("</font>") ) ) , Test.class); System.out.println(response9.took()); System.out.println(response9.hits().total().value()); response9.hits().hits().forEach(e -> { System.out.println(e.source().toString()); for (Map.Entry<String, List<String>> entry : e.highlight().entrySet()) { System.out.println("Key = " + entry.getKey()); entry.getValue().forEach(System.out::println); } });
Elasticsearch Java API Client客户端中的高亮查询,主要用于给查询出的关键词添加一个标识符,便于前端展示。使用highlight字段,其中fields的key代表需要标记的字段名称,preTags代表需要添加标记的前缀,postTags代表需要添加标记的后缀。同时响应的获取方式也有所改变,具体可以参照上述代码。
聚合查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// 聚合查询 SearchResponse<Test> response10 = client.search(s -> s .index("newapi") .aggregations("maxAge", a -> a .max(m -> m .field("age") ) ) , Test.class); System.out.println(response10.took()); System.out.println(response10.hits().total().value()); response10.hits().hits().forEach(e -> { System.out.println(e.source().toString()); }); for (Map.Entry<String, Aggregate> entry : response10.aggregations().entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue().max().value()); }
Elasticsearch Java API Client客户端中的聚合查询,主要用于数据的统计,这里演示一下获取最大值。首先使用的是aggregations方法,aggregations方法的key可以自行起名,max代表最大值,可以参照api获取更多的查询方式,这里只演示下max方法,其他方法与其类似。field代表需要获取最大值的字段名称。响应的获取方式也有所不同,需要拿到响应中的aggregations参数,我这里直接进行Map循环以获取统计出的最大值数据。
// 分组查询 SearchResponse<Test> response11 = client.search(s -> s .index("newapi") .size(100) .aggregations("ageGroup", a -> a .terms(t -> t .field("age") ) ) , Test.class); System.out.println(response11.took()); System.out.println(response11.hits().total().value()); response11.hits().hits().forEach(e -> { System.out.println(e.source().toString()); }); Aggregateaggregate= response11.aggregations().get("ageGroup"); LongTermsAggregatelterms= aggregate.lterms(); Buckets<LongTermsBucket> buckets = lterms.buckets(); for (LongTermsBucket b : buckets.array()) { System.out.println(b.key() + " : " + b.docCount()); }
Elasticsearch Java API Client客户端中的分组查询,也是属于聚合查询的一部分,所以同样使用aggregations方法,并使用terms方法来代表分组查询,field传入需要分组的字段,最后通过响应中的aggregations参数来获取,这里需要根据数据的类型来获取最后的分组结果,我这里因为统计的是数字类型,所以使用LongTermsAggregate来获取结果,最后打印出docCount属性即可。