首页 > 编程 > Java > 正文

SpringBoot整合Elasticsearch7.2.0的实现方法

2019-11-26 08:40:33
字体:
来源:转载
供稿:网友

Spring boot 2.1.X整合Elasticsearch最新版的一处问题

新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.2.X版本了,为了更好的使用Elasticsearch的新特性,所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elasticsearch,以便启用对新版本支持,目前的版本对应关系如下

Elasticsearch(ES)有两种连接方式:transport、rest。transport通过TCP方式访问ES(只支持java),rest方式通过http API 访问ES(没有语言限制)。
ES官方建议使用rest方式, transport 在7.0版本中不建议使用,在8.X的版本中废弃。

引入依赖:

 <dependency>      <groupId>org.elasticsearch</groupId>      <artifactId>elasticsearch</artifactId>      <version>${elasticsearch.version}</version>    </dependency>    <dependency>      <groupId>org.elasticsearch.client</groupId>      <artifactId>elasticsearch-rest-client</artifactId>      <version>${elasticsearch.version}</version>    </dependency>    <dependency>      <groupId>org.elasticsearch.client</groupId>      <artifactId>elasticsearch-rest-high-level-client</artifactId>      <version>${elasticsearch.version}</version>    </dependency>

application.yml配置:

elasticsearch: ip: 192.168.52.132:9200

客户端连接配置类

package com.dc.elastic.configuration;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpHost;import org.apache.http.client.config.RequestConfig;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestClientBuilder;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Arrays;import java.util.Objects;/** * 描述: 连接客户端 * * @author leo * @create 2019-08-25 13:22 */@Configurationpublic class ElasticsearchRestClient{  /**   * 超时时间设为5分钟   */  private static final int TIME_OUT = 5 * 60 * 1000;  private static final int ADDRESS_LENGTH = 2;  private static final String HTTP_SCHEME = "http";  @Value("${elasticsearch.ip}")  String[] ipAddress;  @Bean  public RestClientBuilder restClientBuilder() {    System.err.println(ipAddress);    HttpHost[] hosts = Arrays.stream(ipAddress)        .map(this::makeHttpHost)        .filter(Objects::nonNull)        .toArray(HttpHost[]::new);    return RestClient.builder(hosts);  }  @Bean(name = "highLevelClient")  public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {    restClientBuilder.setRequestConfigCallback(        new RestClientBuilder.RequestConfigCallback() {          @Override          public RequestConfig.Builder customizeRequestConfig(              RequestConfig.Builder requestConfigBuilder) {            return requestConfigBuilder.setSocketTimeout(TIME_OUT);          }        });    //TODO 此处可以进行其它操作    return new RestHighLevelClient(restClientBuilder);  }  private HttpHost makeHttpHost(String s) {    assert StringUtils.isNotEmpty(s);    String[] address = s.split(":");    if (address.length == ADDRESS_LENGTH) {      String ip = address[0];      int port = Integer.parseInt(address[1]);      System.err.println(ip+"+"+port);      return new HttpHost(ip, port, HTTP_SCHEME);    } else {      return null;    }  }}

测试controller

 @RequestMapping("/test")  public void test(@RequestParam String keyword) {    Integer pageIndex = 1;    Integer pageSize = 5;    String indexName = "vw_ods";    Map<String, Object> data = new HashMap<>();    data.put("clearacctname", keyword);    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();    SearchRequest searchRequest = new SearchRequest(indexName);    // searchRequest.types(indexName);    queryBuilder(pageIndex, pageSize, data, indexName, searchRequest);    try {      SearchResponse response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);      for (SearchHit hit : response.getHits().getHits()) {        Map<String, Object> map = hit.getSourceAsMap();        map.put("id", hit.getId());        result.add(map);        // 取高亮结果        Map<String, HighlightField> highlightFields = hit.getHighlightFields();        HighlightField highlight = highlightFields.get("clearacctname");        Text[] fragments = highlight.fragments(); // 多值的字段会有多个值        String fragmentString = fragments[0].string();        System.out.println("高亮:" + fragmentString);      }      System.out.println("pageIndex:" + pageIndex);      System.out.println("pageSize:" + pageSize);      System.out.println(response.getHits().getTotalHits());      System.out.println(result.size());      for (Map<String, Object> map : result) {        System.out.println(map.get("clearacctname"));      }    } catch (IOException e) {      e.printStackTrace();    }  }  private void queryBuilder(Integer pageIndex, Integer pageSize, Map<String, Object> query, String indexName,               SearchRequest searchRequest) {    if (query != null && !query.keySet().isEmpty()) {      SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();      if (pageIndex != null && pageSize != null) {        searchSourceBuilder.size(pageSize);        if (pageIndex <= 0) {          pageIndex = 0;        }        searchSourceBuilder.from((pageIndex - 1) * pageSize);      }      BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();      query.keySet().forEach(key -> {        boolBuilder.must(QueryBuilders.matchQuery(key, query.get(key)));      });      searchSourceBuilder.query(boolBuilder);      HighlightBuilder highlightBuilder = new HighlightBuilder();      HighlightBuilder.Field highlightTitle =          new HighlightBuilder.Field("title").preTags("<strong>").postTags("</strong>");      highlightTitle.highlighterType("unified");      highlightBuilder.field(highlightTitle);      searchSourceBuilder.highlighter(highlightBuilder);      SearchRequest source = searchRequest.source(searchSourceBuilder);    }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表