目錄
為什么使用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);
}