java操作es有2種方式:
1.通過9300端口 tcp ransport-api.jar 但不能適配版本 不建議使用
2.通過9200端口 http Elasticsearch-Rest-Client 官方restclient 建議使用
導入依賴
//導入依賴 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.4.2</version> </dependency> //導入的版本與es版本一致7.4.2 //打開maven插件看dependencies中管理的依賴es版本是7.9.3 //因為springboot已經對es的版本做了管理 xml重寫下es版本 <properties> <java.version>1.8</java.version> <elasticsearch.version>7.4.2</elasticsearch.version> </properties> springboot中es版本也改過來了
配置es
//類似數據庫dao配置 代碼通用的 @Configuration public class GuliESConfig { public static final RequestOptions COMMON_OPTIONS; static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); COMMON_OPTIONS = builder.build(); } @Bean public RestHighLevelClient esRestClient() { RestClientBuilder builder = null; // 可以指定多個es builder = RestClient.builder(new HttpHost("192.168.112.151", 9200, "http") // ,new HttpHost("host", 9200, "http") ); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } } //其它代碼用到es注入就行了 @Autowired private RestHighLevelClient esRestClient;
java es保存測試 IndexRequest
@Autowired private RestHighLevelClient esRestClient; /** * 保存數據 * @throws IOException */ @Test void indexData() throws IOException{ //設置保存的索引和id IndexRequest indexRequest = new IndexRequest("users"); indexRequest.id("1"); //保存的數據 這里指定json類型 indexRequest.source("{\"test\":1}", XContentType.JSON); //執行保存 index同步 indexAsync異步 IndexResponse index = esRestClient.index(indexRequest, GuliESConfig.COMMON_OPTIONS); System.out.println(index); }
java es 檢索測試 SearchRequest
相當查詢 "query": { "match": { "address": "Mill" } }
@Test public void find() throws IOException { // 1 創建檢索請求 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("bank"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 構造檢索條件 // sourceBuilder.query(); // sourceBuilder.from(); // sourceBuilder.size(); // sourceBuilder.aggregation(); sourceBuilder.query(QueryBuilders.matchQuery("address","mill")); System.out.println(sourceBuilder.toString()); searchRequest.source(sourceBuilder); // 2 執行檢索 SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS); // 3 分析響應結果 System.out.println(response.toString()); }
查詢結果轉為bean
// 3.1 獲取java bean Account是bean類 SearchHits hits = response.getHits(); SearchHit[] hits1 = hits.getHits(); for (SearchHit hit : hits1) { hit.getId(); hit.getIndex(); String sourceAsString = hit.getSourceAsString(); Account account = JSON.parseObject(sourceAsString, Account.class); System.out.println(account); }
聚合檢索測試
搜索address中包含mill的所有人的年齡分布以及平均年齡,平均薪資
GET bank/_search { "query": { "match": { "address": "Mill" } }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 } }, "ageAvg": { "avg": { "field": "age" } }, "balanceAvg": { "avg": { "field": "balance" } } } }
java代碼測試如下
/** * 聚合檢索 * @throws IOException */ @Test public void jhfind() throws IOException { // 1 創建檢索請求 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("bank"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 構造檢索條件 // sourceBuilder.query(); // sourceBuilder.from(); // sourceBuilder.size(); // sourceBuilder.aggregation(); sourceBuilder.query(QueryBuilders.matchQuery("address","mill")); //AggregationBuilders工具類構建AggregationBuilder // 構建第一個聚合條件:按照年齡的值分布 TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名稱 // 參數為AggregationBuilder sourceBuilder.aggregation(agg1); // 構建第二個聚合條件:平均薪資 AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance"); sourceBuilder.aggregation(agg2); System.out.println("檢索條件"+sourceBuilder.toString()); searchRequest.source(sourceBuilder); // 2 執行檢索 SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS); // 3 分析響應結果 System.out.println(response.toString()); }
檢索結果處理
// 3.2 獲取檢索到的分析信息 //實際測試檢索結果aggregations下名稱不是"agg2"而是"avg#agg2" 不是"agg1"而是"lterms#agg1" 暫不知道是什么原因 先記錄着 Aggregations aggregations = response.getAggregations(); Terms agg21 = aggregations.get("agg2"); //"avg#agg2" for (Terms.Bucket bucket : agg21.getBuckets()) { String keyAsString = bucket.getKeyAsString(); System.out.println(keyAsString); }