1.引入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
springboot自动引入的依赖可能版本不同,需要自己指定版本
2.配置类
es配置了账号密码
@Configuration
public class GulimallElasticSearchConfig {
public static final String username = "elastic";
public static final String password = "xxx624753336";
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClient(){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password)); //es账号密码
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("xxx.xxx.xxx.xxx", 9200, "http")
).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
})
);
return client;
}
}
es没有密码:
@Configuration
public class GuliMallElasticSearchConfig {
@Bean
public RestHighLevelClient esRestClient(){
//String hostname, int port, String scheme
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("192.168.155.3",9200,"http")));//http协议不写也行,默认就是
return client;
}
}
3.简单使用
官方文档:es官方操作文档
1.新增索引
//创建请求 指定索引
IndexRequest indexRequest = new IndexRequest("users");
//指定id 保证不会重复添加
indexRequest.id("1");
//创建对象
User user = new User();
user.setUserName("zhangsanlisi");
user.setAge(18);
user.setGender("男");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss ");
String format = simpleDateFormat.format(new Date());
user.setCreateTime(format);
//将数据转为JSON 利用fastjson
String jsonString = JSON.toJSONString(user);
indexRequest.source(jsonString, XContentType.JSON); //要保存的内容
//将数据保存到es
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
//查看返回
System.out.println(indexResponse);
get /users/_search
2.复杂检索
步骤:
1.创建检索请求,可以指定索引和searchSourceBuilder。
2.构建检索条件
3.执行检索
4.通过查询返回的SearchResponse进行结果分析
//1.创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL 检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchRequest.source(searchSourceBuilder);
//searchSourceBuilder.query();
//searchSourceBuilder.from();
//searchSourceBuilder.size();
//searchSourceBuilder.aggregation();
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//聚合条件 AggregationBuilders工具类构造聚合条件 聚合的名字 ageagg 根据age字段进行聚合
TermsAggregationBuilder ageagg = AggregationBuilders.terms("ageagg").field("age").size(10);
searchSourceBuilder.aggregation(ageagg);
//计算平均薪资
AvgAggregationBuilder balanceavg = AggregationBuilders.avg("bananceavg").field("balance");
searchSourceBuilder.aggregation(balanceavg);
System.out.println(searchSourceBuilder);
//2.执行检索
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
//3.分析结果
System.out.println(searchResponse);
//获取所有查到的数据
SearchHits searchHits = searchResponse.getHits();
//获取hits中的hits
SearchHit[] hits = searchHits.getHits();
//遍历hits
for (SearchHit hit : hits) {
//获取hits中source的值 转为字符串
String sourceAsString = hit.getSourceAsString();
//json转为对象
root parseObject = JSON.parseObject(sourceAsString, root.class);
//打印对象信息
System.out.println(parseObject);
}
//获取聚合信息
Aggregations aggregations = searchResponse.getAggregations();
//List<Aggregation> aggregationList = aggregations.asList();
//for (Aggregation aggregation : aggregationList) {
// System.out.println("当前聚合:"+aggregation.getName());
//}
//根据聚合名字获取
Terms ageagg1 = aggregations.get("ageagg");
//获取到buckets中数据
List<? extends Terms.Bucket> buckets = ageagg1.getBuckets();
//遍历数据
for (Terms.Bucket bucket : buckets) {
//获取到聚合的信息 比如年龄分布+分布的数量
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄:"+keyAsString+"==>"+bucket.getDocCount());
}
//获取到平均新资的聚合信息
Avg balanceagee = aggregations.get("bananceavg");
System.out.println("平均新资:"+balanceagee.getValue());
kibana查出的信息
程序查出的数据