目录
为什么使用ES-Rest-Client
其他工具
通过9300:tcp
- 由于springboot版本不同,transport-api.jar不同,不能适配较高的es版本
- 7.x不建议使用,8.0要废弃
通过9200:http发送请求
JestClient:非官方,更新慢
RestTemplate:spring自带的,模拟发送Http请求,ES很多操作(DSL语句)需要自己封装,麻烦
HttpClient:同上
Elasticsearch-Rest-Client:官方提供,封装了ES操作,API层次分明,上手简单
(https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-hight.html)
构建
导入maven地址
<!--导入Elasticsearch-Rest-Client的maven地址-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
-
查看springboot2.4.3的es依赖配置
发现是7.9.3版本而我们用的是7.6.2版本 -
在pom.xml中配置版本号为7.6.2
可以看到maven依赖全部变为7.6.2了
使用---详细见官方文档
Java Rest Client官方文档,(https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high.html)
存储信息到es
public void indexData() throws IOException {
//创建构造器指定idnex索引
IndexRequest indexRequest = new IndexRequest("users");
indexRequest.id("1");//id
//以k-v形式存储
// indexRequest.source("userName","zhangsan","age",18,"gender","男");
//以实体类存储
User user = new User();
user.setAge(18);
user.setUserName("zhansan");
user.setGender("男");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
indexRequest.source(json, XContentType.JSON);//要保存的内容,一定要传内容类型
//执行操作
IndexResponse index = client.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
//提取有用的响应数据
System.out.println(index);
}
查询和聚合分析数据
各种查询在QueryBuilders工具类中都有
AggregationBuilders是聚合分析的工具类
public void searchData() throws IOException{
//创建检索请求
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("bank");//指定检索的索引
//指定DSL,检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//构造检索条件
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//使用聚合
//1).按照年龄大小分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
sourceBuilder.aggregation(ageAgg);
//2).计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
sourceBuilder.aggregation(balanceAvg);
//System.out.println("检索条件"+sourceBuilder.toString());
System.out.println(sourceBuilder.toString());
// searchSourceBuilder.from();
// searchSourceBuilder.size();
// searchSourceBuilder.aggregation();
searchRequest.source(sourceBuilder);
//执行检索
SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//System.out.println(searchResponse.toString());
//3.分析结果 searchResponse
ObjectMapper objectMapper = new ObjectMapper();
//转化为map可以提取出想要的值
// Map map = objectMapper.readValue(searchResponse.toString(), Map.class);
//官方还提供了简便方法可以直接获取查询,聚合的结果
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();//获取所有命中的记录
for (SearchHit hit:searchHits){
String json = hit.getSourceAsString();
Account account = objectMapper.readValue(json,Account.class);
}
//获取检索到的聚合分析信息
Aggregations aggregations = searchResponse.getAggregations();
aggregations.asList();//将所有聚合信息转化为list
for(Aggregation aggregation1:aggregations.asList()){
aggregation1.getName();//打印出当前聚合名字,例如ageAgg、balanceAvg
}
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket:ageAgg1.getBuckets()){
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄"+keyAsString);
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("获取平均薪资"+balanceAvg1.getValue());
}
实现高亮检索
(https://blog.csdn.net/qq_37362891/article/details/103295317)
实现复合查询
(https://blog.csdn.net/u014646662/article/details/97130086)
实现多重查询
/**
* 实现多重查询
*/
@Test
public void test9() throws IOException {
MultiSearchRequest request = new MultiSearchRequest();
SearchRequest firstSearchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("goodsTitle","英雄联盟"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
firstSearchRequest.source(searchSourceBuilder);
request.add(firstSearchRequest);
System.out.println("检索一:"+searchSourceBuilder.toString());
SearchRequest secondSearchRequest = new SearchRequest();
searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("goodsDes","英雄联盟"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
secondSearchRequest.source(searchSourceBuilder);
System.out.println("检索二:"+searchSourceBuilder.toString());
request.add(secondSearchRequest);
System.out.println(request.toString());
MultiSearchResponse getResponse = client.msearch(request,ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(getResponse);
}