Elastic Search 的底层是开源库 Lucene。然而Lucene的应用门槛比拟高,必须本人写代码去调用它的接口。而Elastic Search的呈现正是为了解决了这个问题,它是 Lucene 的封装,提供了 REST API 的操作接口,咱们能够开箱即用。

<!-- more -->

环境

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

依赖

        <!--   集成es client,并排除低版本依赖(5.6)     -->        <dependency>            <groupId>org.elasticsearch.client</groupId>            <artifactId>elasticsearch-rest-high-level-client</artifactId>            <version>7.1.1</version>            <exclusions>                <exclusion>                    <groupId>org.elasticsearch</groupId>                    <artifactId>elasticsearch</artifactId>                </exclusion>                <exclusion>                    <groupId>org.elasticsearch.client</groupId>                    <artifactId>elasticsearch-rest-client</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.elasticsearch.client</groupId>            <artifactId>elasticsearch-rest-client</artifactId>            <version>7.1.1</version>        </dependency>        <dependency>            <groupId>org.elasticsearch</groupId>            <artifactId>elasticsearch</artifactId>            <version>7.1.1</version>        </dependency>

配置

应用配置类配置,能够参考如下所示:
先创立一个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<HttpHost> httpHosts;    private EsClientBuilder(List<HttpHost> 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<HttpHost> 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容器治理:

@Configurationpublic class ESConfig {    @Value("${elasticsearch.nodes}")    private List<String> 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<HttpHost> 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();    }}

再配置一下罕用的配置:

#配置eselasticsearch:  #  如果是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至此完结。

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