上一篇文章我们已经在springboot中集成了Es,这次我们来继续使用java来给es发请求
//测试存储到es
@Test
public void indexData() throws IOException {
//指定索引
IndexRequest indexRequest = new IndexRequest("users");
indexRequest.id("1");
User user = new User();
String string = JSON.toJSonString(user);
indexRequest.source(string, XContentType.JSON);
//执行操作
IndexResponse index = client.index(indexRequest, GulimallElasticSearchCongfig.COMMON_OPIONS);
//提取有用的响应数据
System.out.println(index);
}
@Data
class User{
private String uesrname;
private String gander;
private Integer age;
}
我们先看一下es中是否存在users这个索引
并不存在我们进行一下操作
插入成功,然后再在es中进行查看
但是我们发现没有数据,因为没有set值重新set值一次执行操作后再看
我们虽然之前指定了id是1,这次插入id还是1并没有报错。数据也成功插入,所以这个写法修改插入都可以。
实现一个复杂检索,之前我们在Kibana里面写的dsl来实现复杂检索,现在我们用Java来实现查找不同年龄分布的平均薪资
@ToString
@Data
static class Accout {
private int accountNumber;
private int balance;
private String firstName;
private String lastName;
private int age;
private String gender;
private String address;
private String employer;
private String email;
private String city;
private String state;
}
public void searchData() throws IOException {
//创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL,创建检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.1构造检索条件
searchSourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
// searchSourceBuilder.size();
// searchSourceBuilder.from();
//1.2先创建不同的聚合条件再使用聚合查询方法,terms指定聚合的名称 field根据什么聚合 size展示多少
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
//1.3计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
searchSourceBuilder.aggregation(balanceAvg);
searchRequest.source(searchSourceBuilder);
//执行检索
SearchResponse search = client.search(searchRequest, GulimallElasticSearchCongfig.COMMON_OPIONS);
//分析结果
//可以把结果转为map 但是会很麻烦
// Map map = JSON.parseObject(searchRequest.toString(), Map.class);
//3.1获取所有查到的数据
//这个hits是最大最外层的hits
SearchHits hits = search.getHits();
//从hits中继续get
SearchHit[] hitsHits = hits.getHits();
for (SearchHit hitsHit : hitsHits) {
// hitsHit.getIndex();
// hitsHit.getType();
// hitsHit.getId();
String sourceAsString = hitsHit.getSourceAsString();
//利用fastJson把得到结果通过实体类转成对象进行一一映射
Accout accout = JSON.parseObject(sourceAsString, Accout.class);
System.out.println(accout);
}
//获取这次检索得到的分析信息 分析当前聚合
Aggregations aggregations = search.getAggregations();
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("当前聚合"+aggregation.getName());
// }
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄" + keyAsString+"几个人:"+bucket.getDocCount());
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪资:" + balanceAvg1.getValue());
}
运行后可以看到查到内容
如果想要测试数据可以看博主第一个博客,里面有json数据连接
这两个地方为什么不是idea自动帮我么能找到的数据类型 Aggregation呢,我们点进去可以看到这个是一个接口,ctrl+h可以看见其所有关系
这个是他所有的类型,也同样是es的一些方法。所以对应的内容转换一下,就可以快捷得到其中的值。



