使用Java High Level REST Client操作elasticsearch

mac2025-09-22  23

基于springboot项目

虽然springboot 提供的有spring data 来操作elasticsearch ,非常方便,但是由于没有找到springdata elasticsearch 访问带有安全验证的es库,所以开发中不得不使用官方提供的client  即Java High Level REST Client 来操作es了

1,添加依赖

注意版本要和es库的一样

<!-- 加入elasticsearch --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.8.3</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.8.3</version> </dependency>

2,application.properties 中配置一些基本信息,当然也可以写到代码里

#es配置 elastic.hosts=xxx.xxx.xxx elastic.port=9200 elastic.schema=http elastic.username=xxx elastic.password=xxx

3,添加配置类RestConfig

 

@Configuration public class RestConfig { @Value("${elastic.hosts}") private String hosts ; // 集群地址,多个用,隔开 @Value("${elastic.port}") private int port ; // 使用的端口号 @Value("${elastic.schema}") private String schema; // 使用的协议 @Value("${elastic.username}") private String userName ;// 用户名 @Value("${elastic.password}") private String password ; // 密码 //静态变量 private static int connectTimeOut = 1000; // 连接超时时间 private static int socketTimeOut = 30000; // 连接超时时间 private static int connectionRequestTimeOut = 500; // 获取连接的超时时间 private static int maxConnectNum = 100; // 最大连接数 private static int maxConnectPerRoute = 100; // 最大路由连接数 /** * * 功能描述: 构建RestHighLevelClient客户端 * * @param: * @return: * @auther: lizk * @date: 2019/10/10 14:55 */ @Bean(autowire = Autowire.BY_NAME, name = "restHighLevelClient") public RestHighLevelClient restClient() { RestClientBuilder clientBuilder = RestClient.builder(new HttpHost(hosts, port, schema)); // 设置超时时间 clientBuilder.setMaxRetryTimeoutMillis(60000); //如果ES设置了密码,那这里也提供了一个基本的认证机制,下面设置了ES需要基本身份验证的默认凭据提供程序 final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); // 异步httpclient连接数配置以及密码配置 clientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute); return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } }); // 异步httpclient连接延时配置 clientBuilder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() { @Override public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) { builder.setConnectTimeout(connectTimeOut); builder.setSocketTimeout(socketTimeOut); builder.setConnectionRequestTimeout(connectionRequestTimeOut); return builder; } }); RestHighLevelClient client = new RestHighLevelClient(clientBuilder); return client; } }

4,然后就可以使用了

/** * 功能描述: * * @param: * @return: * @auther: lizk * @date: 2019/10/21 11:57 */ @Resource(name = "restHighLevelClient")//通过指定对应的名称注入 private RestHighLevelClient highLevelClient; /** * 功能描述: * * @param searchText 搜索内容 * @param userName 用户名 * @param searchTime 搜索时间 * @param entrance 入口 * @return 返回Result * @auther: lizk * @date: 2019/10/21 11:58 */ @ApiOperation(value = "新增搜索记录接口", notes = "新增搜索记录接口") @PostMapping("/recode") public Result insert(String searchText, String userName, String searchTime, String entrance) { Result result = new Result(); Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("searchText", searchText); jsonMap.put("userName", userName); //jsonMap.put("userId",userId); jsonMap.put("searchTime", searchTime); jsonMap.put("entrance", entrance); IndexRequest indexRequest = new IndexRequest() .index("searchrecord") .type("doc") .id(UUID.randomUUID().toString()).source(jsonMap); try { IndexResponse indexResponse = highLevelClient.index(indexRequest, RequestOptions.DEFAULT); result.success200(Constants.SAVE_SUCCESS); } catch (Exception e) { log.info(e.getMessage()); result.error500(Constants.SAVE_FAILURE); } return result; } /** * * 功能描述: * * @param: * @return 返回Result * @auther: lizk * @date: 2019/10/21 17:29 */ @ApiOperation(value = "热门词汇接口", notes = "热门词汇接口") @GetMapping("/hotword") public Result hot() { Result result = new Result(); try { SearchRequest request = new SearchRequest().indices("searchrecord"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //根据搜索关键词聚合,取前五个 TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("searchText").field("searchText") .size(5); QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); sourceBuilder.query(queryBuilder).aggregation(termsAggregationBuilder); request.source(sourceBuilder); //返回结果 SearchResponse searchResponse = highLevelClient.search(request, RequestOptions.DEFAULT); //得到聚合结果 Aggregations aggregations = searchResponse.getAggregations(); Map<String, Aggregation> aggregationMap = aggregations.getAsMap(); Terms companyAggregation = (Terms) aggregationMap.get("searchText"); List<? extends Terms.Bucket> buckets = companyAggregation.getBuckets(); //返回list List<String> hotword = new ArrayList<>(); for (Terms.Bucket bucket : buckets) { hotword.add(bucket.getKeyAsString()); } result.setData(hotword); result.success200(Constants.SAVE_SUCCESS); } catch (Exception e) { log.info(e.getMessage()); result.error500(Constants.SAVE_FAILURE); } return result; }

 

附 参考文章

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

最新回复(0)