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); }