zoukankan      html  css  js  c++  java
  • SpringBoot整合Elasticsearch7.2.0的实现方法-转载

    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的版本中废弃。

    1.引入依赖:

     <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>

    2.application.yml配置:

    elasticsearch:
     ip: 0.0.0.0:9200

    3.客户端连接配置类

    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
     */
    @Configuration
    public 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;
        }
      }
    }

    4.测试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);
        }
      }
    程序开发机器人 琴酒、灰原哀、刺痛是我心尖尖上的人 最爱琴酒、灰原哀、刺痛
  • 相关阅读:
    C#连接MySQL
    国双面试题
    Redis入门安装配置
    vs2013密钥
    单例模式
    用R画韦恩图
    Snipaste截图
    秩和检验
    用R包中heatmap画热图
    OTU(operational taxonomic units),即操作分类单元
  • 原文地址:https://www.cnblogs.com/doudou0809/p/13958263.html
Copyright © 2011-2022 走看看