「Elasticsearch」SpringBoot快速集成ES

Elastic Search 的底层是开源库 Lucene。但是Lucene的使用门槛比较高,必须自己写代码去调用它的接口。而Elastic Search的出现正是为了解决了这个问题,它是 Lucene 的封装,提供了 REST API 的操作接口,我们可以开箱即用。

环境

  • JDK版本:8
  • SpringBoot:2.x
  • ES版本:7.1.1

依赖


            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.1.1

                    org.elasticsearch
                    elasticsearch

                    org.elasticsearch.client
                    elasticsearch-rest-client

            org.elasticsearch.client
            elasticsearch-rest-client
            7.1.1

            org.elasticsearch
            elasticsearch
            7.1.1

配置

使用配置类配置,可以参考如下所示:
先创建一个builder,用于初始化ES client

public class EsClientBuilder {
    private int connectTimeoutMillis = 1000;
    private int socketTimeoutMillis = 30000;
    private int connectionRequestTimeoutMillis = 500;
    private int maxConnectPerRoute = 10;
    private int maxConnectTotal = 30;

    private final List httpHosts;

    private EsClientBuilder(List httpHosts) {
        this.httpHosts = httpHosts;
    }

    public EsClientBuilder setConnectTimeoutMillis(int connectTimeoutMillis) {
        this.connectTimeoutMillis = connectTimeoutMillis;
        return this;
    }

    public EsClientBuilder setSocketTimeoutMillis(int socketTimeoutMillis) {
        this.socketTimeoutMillis = socketTimeoutMillis;
        return this;
    }

    public EsClientBuilder setConnectionRequestTimeoutMillis(int connectionRequestTimeoutMillis) {
        this.connectionRequestTimeoutMillis = connectionRequestTimeoutMillis;
        return this;
    }

    public EsClientBuilder setMaxConnectPerRoute(int maxConnectPerRoute) {
        this.maxConnectPerRoute = maxConnectPerRoute;
        return this;
    }

    public EsClientBuilder setMaxConnectTotal(int maxConnectTotal) {
        this.maxConnectTotal = maxConnectTotal;
        return this;
    }

    public static EsClientBuilder build(List httpHosts) {
        return new EsClientBuilder(httpHosts);
    }

    public RestHighLevelClient create() {

        HttpHost[] httpHostArr = httpHosts.toArray(new HttpHost[0]);
        RestClientBuilder builder = RestClient.builder(httpHostArr);

        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeoutMillis);
            requestConfigBuilder.setSocketTimeout(socketTimeoutMillis);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeoutMillis);
            return requestConfigBuilder;
        });

        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectTotal);
            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
            return httpClientBuilder;
        });

        return new RestHighLevelClient(builder);
    }
}

再交给spring容器管理:

@Configuration
public class ESConfig {
    @Value("${elasticsearch.nodes}")
    private List nodes;

    @Value("${elasticsearch.schema}")
    private String schema;

    @Value("${elasticsearch.max-connect-total}")
    private Integer maxConnectTotal;

    @Value("${elasticsearch.max-connect-per-route}")
    private Integer maxConnectPerRoute;

    @Value("${elasticsearch.connection-request-timeout-millis}")
    private Integer connectionRequestTimeoutMillis;

    @Value("${elasticsearch.socket-timeout-millis}")
    private Integer socketTimeoutMillis;

    @Value("${elasticsearch.connect-timeout-millis}")
    private Integer connectTimeoutMillis;

    @Bean
    public RestHighLevelClient getRestHighLevelClient() {
        List httpHosts = new ArrayList<>();
        for (String node : nodes) {
            try {
                String[] parts = StringUtils.split(node, ":");
                Assert.notNull(parts,"Must defined");
                Assert.state(parts.length == 2, "Must be defined as 'host:port'");
                httpHosts.add(new HttpHost(parts[0], Integer.parseInt(parts[1]), schema));
            } catch (RuntimeException ex) {
                throw new IllegalStateException(
                        "Invalid ES nodes " + "property '" + node + "'", ex);
            }
        }

        return EsClientBuilder.build(httpHosts)
                .setConnectionRequestTimeoutMillis(connectionRequestTimeoutMillis)
                .setConnectTimeoutMillis(connectTimeoutMillis)
                .setSocketTimeoutMillis(socketTimeoutMillis)
                .setMaxConnectTotal(maxConnectTotal)
                .setMaxConnectPerRoute(maxConnectPerRoute)
                .create();
    }
}

再配置一下常用的配置:

#配置es
elasticsearch:
  #  如果是cluster,application.yml的nodes设置多个ip:host逗号隔开即可。
  nodes: 127.0.0.1:9200
  schema: http
  max-connect-total: 50
  max-connect-per-route: 10
  connection-request-timeout-millis: 500
  socket-timeout-millis: 30000
  connect-timeout-millis: 1000

使用

接下来我们测试一下配置是否生效,一个简单的验证送给大家,如下所示:

@Autowired
    private RestHighLevelClient client;
    @Test
    public void test() throws IOException {
        MainResponse info = client.info(RequestOptions.DEFAULT);
        System.out.println(info.toString());
    }

配置生效的话,就会返回Elastic Search的配置信息:包含当前节点、集群、版本等信息。
SpringBoot集成ES至此结束。

本文可转载,但需声明原文出处。 程序员小明,一个很少加班的程序员。欢迎关注微信公众号,获取更多优质文章。

Original: https://www.cnblogs.com/coderxx/p/14097303.html
Author: Coder小明
Title: 「Elasticsearch」SpringBoot快速集成ES

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713125/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • wordpress说明

    ea.zhoujingen.cn 网站备注 BackWPup备份插件,需要时启动插件备份,否则导致网站打开Waiting(TTFB)增加1秒 Original: https://w…

    技术杂谈 2023年5月31日
    0101
  • 西西成语接龙小助手

    介绍 代码地址:https://github.com/taishan1994/chinese_chengyujielong 读完该文,你可以收获: python爬虫的简单使用。 构…

    技术杂谈 2023年6月1日
    071
  • spark学习记录之join引发重复计算

    一直对spark sql中的join操作感到迷惑, 如果join之前的操作没有进行persist DataFrame的话,是否会存在让之前的transformation重复执行的问…

    技术杂谈 2023年6月21日
    086
  • Rsync数据备份工具

    Rsync数据备份工具 1、Rsync基本概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步(windows和Linux之间 Mac和 Linux Linux和Lin…

    技术杂谈 2023年6月21日
    084
  • Maven项目搭建-Eclipse版

    一、Maven简单介绍 Maven是基于Java平台的项目构建(mvn clean install)、依赖管理(中央仓库,Nexus)和项目信息管理的项目管理工具。 Maven是基…

    技术杂谈 2023年5月31日
    089
  • 【转】flask-socketio的版本问题

    报错The client is using an unsupported version of the Socket.IO or Engine.IO protocols (furt…

    技术杂谈 2023年6月1日
    063
  • IO流—-读取文件,复制文件,追加/插入文件

    文件结构 读取文件 第一种方式 第二种方式: 复制文件 追加/插入文件 追加: 一个文件插入另一个文件: FileInputStream和FileOutputStream的简单用法…

    技术杂谈 2023年7月24日
    068
  • JBoss4.2.2配置及优化

    本文是在[url=http://solarisxb.cublog.cn]SOLARIS小兵[/url]的[url=http://blog.chinaunix.net/u/504/s…

    技术杂谈 2023年5月30日
    065
  • c# Winform DataGridView 当前单元格失去焦点的有关问题

    在一个DataGridview中的某一个单元格输入了内容,点击窗体上的Button按钮(输入的光标还在那个输入的单元格中,没有失去焦点),获取到的那个单元格的值不是刚才输入的值,还…

    技术杂谈 2023年5月31日
    076
  • Vue系列—源码调试(二)

    我们要对Vue源码进行分析,首先我们需要能够对vue源码进行调式(这里的源码调式是ES6版本的,不是打包后的代码),因此首先我们要去官方github上克隆一份vue项目下来,如下具…

    技术杂谈 2023年6月1日
    062
  • flutter创建项目

    一、终端方式 1、创建flutter项目: 出现: 2、先直接打开Xcode自带iOS模拟器,否则会运行在macOS (macos)或Chrome (chrome)上。 3、运行项…

    技术杂谈 2023年6月1日
    064
  • iOS 字符串 去除空格

    NSString *str = @” this is a test . “; 去掉两端的空格 str = [str stringByTrimmingCharactersInSet:…

    技术杂谈 2023年5月30日
    064
  • 字符串匹配之Sunday算法

    简介 Sunday算法是一种字符串匹配算法,相比于KMP算法,它比较简单易学。 在有些时候,比如字符串很长的时候,它是比KMP要高效的。 核心思想 从前往后匹配,匹配失败时关注主串…

    技术杂谈 2023年7月11日
    053
  • flask gevent

    flask的不同部署方式 使用gevent部署,只是在不同请求之间是异步的,同一个请求之间还是串行的。 https://iximiuz.com/en/posts/flask-gev…

    技术杂谈 2023年7月10日
    082
  • 深度学习—人工智能的第三次热潮

    深度学习的历史趋势 迄今为止深度学习已经经历了3次发展浪潮: 20世纪40年代到60年代,深度学习的雏形出现在控制论(cybernetics)中; 20世纪80年代到90年代,深度…

    技术杂谈 2023年7月23日
    068
  • 【源码笔记】ThreadPoolExecutor#addWorker

    /** * Checks if a new worker can be added with respect to current * pool state and the giv…

    技术杂谈 2023年7月24日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球