SpringBoot整合Elasticsearch7.2.0的实现方法

 更新时间:2019年08月26日 09:52:34   作者:onlooker  
这篇文章主要介绍了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的版本中废弃。

引入依赖:

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

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

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

相关文章

  • 解决SpringBoot jar包中的文件读取问题实现

    解决SpringBoot jar包中的文件读取问题实现

    这篇文章主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    这篇文章主要介绍了Java线程操作的常见方法,结合实例形式总结分析了java线程的创建、线程名称的获取、设置以及线程启动的判断等相关操作实现技巧,需要的朋友可以参考下
    2019-10-10
  • 关于@ConditionalOnProperty的作用及用法说明

    关于@ConditionalOnProperty的作用及用法说明

    这篇文章主要介绍了关于@ConditionalOnProperty的作用及用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java如何替换RequestBody和RequestParam参数的属性

    Java如何替换RequestBody和RequestParam参数的属性

    近期由于接手的老项目中存在所有接口中新增一个加密串来给接口做一个加密效果,所以就研究了一下Http请求链路,发现可以通过 javax.servlet.Filter去实现,这篇文章主要介绍了Java替换RequestBody和RequestParam参数的属性,需要的朋友可以参考下
    2023-10-10
  • Java Swing中的表格(JTable)和树(JTree)组件使用实例

    Java Swing中的表格(JTable)和树(JTree)组件使用实例

    这篇文章主要介绍了Java Swing中的表格(JTable)和树(JTree)组件使用实例,本文同时讲解了表格和树的基本概念、常用方法、代码实例,需要的朋友可以参考下
    2014-10-10
  • java项目中classpath的理解

    java项目中classpath的理解

    这篇文章介绍了java项目中classpath的理解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 浅谈Java关闭线程池shutdown和shutdownNow的区别

    浅谈Java关闭线程池shutdown和shutdownNow的区别

    本文主要介绍了Java关闭线程池shutdown和shutdownNow的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java贪心算法之Prime算法原理与实现方法详解

    Java贪心算法之Prime算法原理与实现方法详解

    这篇文章主要介绍了Java贪心算法之Prime算法原理与实现方法,简单描述了Prime算法的概念、原理、实现与使用技巧,需要的朋友可以参考下
    2017-09-09
  • Spring整合Mybatis具体代码实现流程

    Spring整合Mybatis具体代码实现流程

    这篇文章主要介绍了Spring整合Mybatis实操分享,文章首先通过介绍Mybatis的工作原理展开Spring整合Mybatis的详细内容,需要的小伙伴可以参考一下
    2022-05-05
  • 解读@Transactional失效的几种情况

    解读@Transactional失效的几种情况

    这篇文章主要介绍了@Transactional失效的几种情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论