ElasticSearch学习笔记-SpringBoot整合Elasticsearch7

项目最近需要接入Elasticsearch7,顺带记录下笔记。
  • Elasticsearch依赖包版本
java 复制代码
<properties>
    <elasticsearch.version>7.9.3</elasticsearch.version>
    <elasticsearch.rest.version>7.9.3</elasticsearch.rest.version>
</properties>

<!-- Elasticsearch依赖包-->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

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

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elasticsearch.rest.version}</version>
</dependency>
  • Elasticsearch连接属性配置,支持单个集群和多个集群的接入。
java 复制代码
@Data
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticsearchProperties {

    private String clusterName = null;

    private String[] clusterNodes = null;

    private int connectTimeout = 1000;

    private int socketTimeout = 30000;

    private int connectionRequestTimeout = 500;

    private int maxConnectTotal = 100;

    private int maxConnectPerRoute = 100;

}
java 复制代码
@Data
@ConfigurationProperties(prefix = "elasticsearch.multi-cluster")
public class MultiElasticsearchProperties {

    /** 是否开启 **/
    private Boolean enable = false;

    /** 配置 */
    private Map<String, ElasticsearchProperties> configs;

}
  • SpringBoot整合Elasticsearch注入容器自动配置
    注:Elasticsearch7.15之后官方将高级客户端RestHighLevelClient标记为弃用状态。
    单集群实例注入Spring容器。
java 复制代码
@EnableConfigurationProperties({ ElasticsearchProperties.class, MultiElasticsearchProperties.class })
@Import({ ElasticsearchBeanDefinitionRegistrar.class })
@Configuration
public class ElasticsearchAutoConfiguration {
	
	@Bean
	public RestHighLevelClient restHighLevelClient(ElasticsearchProperties elasticsearchProperties) {
		return new RestHighLevelClient((RestClientBuilder)
			Objects.requireNonNull(new RestClientBuilderFactoryBean(elasticsearchProperties).getObject()));
	}

	@Bean
	@ConditionalOnMissingBean
	public ElasticsearchService elasticsearchService(RestHighLevelClient restHighLevelClient) {
		return new ElasticsearchServiceImpl(restHighLevelClient);
	}
	
}

多集群实例注入Spring容器。

java 复制代码
public class ElasticsearchBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {

    private MultiElasticsearchProperties multiElasticsearchProperties;

    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        if (null == multiElasticsearchProperties) {
            return;
        }
        Boolean enable = multiElasticsearchProperties.getEnable();
        if (null == enable || !enable) {
            return;
        }
        Map<String, ElasticsearchProperties> configs = multiElasticsearchProperties.getConfigs();
        if (null == configs || configs.isEmpty()) {
            return;
        }
        configs.forEach((name, elasticsearchProperties) -> {
            RootBeanDefinition beanDefinition = new RootBeanDefinition();
            beanDefinition.setBeanClass(RestHighLevelClient.class);
            beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(
                Objects.requireNonNull(new RestClientBuilderFactoryBean(elasticsearchProperties).getObject()));
            beanDefinitionRegistry.registerBeanDefinition(String.format("%sRestHighLevelClient", name), beanDefinition);

        });
    }

    @Override
    public void setEnvironment(Environment environment) {
        BindResult<MultiElasticsearchProperties> bindResult = Binder.get(environment)
            .bind(getPropertiesPrefix(MultiElasticsearchProperties.class), MultiElasticsearchProperties.class);
        if (null != bindResult && bindResult.isBound()) {
            multiElasticsearchProperties = bindResult.get();
        }
    }

    private String getPropertiesPrefix(Class<?> clazz) {
        return Objects.requireNonNull(AnnotationUtils.getAnnotation(clazz, ConfigurationProperties.class)).prefix();
    }

}
  • spring.factories文件开启自动配置
java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.component.sdk.elasticsearch7.config.ElasticsearchAutoConfiguration
  • 项目配置文件引入Elasticsearch示例
java 复制代码
elasticsearch:
  cluster-name: cluster
  cluster-nodes:
    - 192.168.0.1:9200
  connect-timeout: 1000
  socket-timeout: 30000
  connection-request-timeout: 500
  max-connect-total: 100
  max-connect-per-route: 100
  multi-cluster:
    enable: false
    configs:
      tmp1:
        cluster-name: cluster
        cluster-nodes:
          - 192.168.0.1:9200
        connect-timeout: 1000
        socket-timeout: 30000
        connection-request-timeout: 500
        max-connect-total: 100
        max-connect-per-route: 100

自此项目可以正常连接Elasticsearch完成相关功能的开发。

相关推荐
Despacito0o3 分钟前
C语言基础:变量与进制详解
java·c语言·开发语言
universe_0137 分钟前
day25|学习前端js
前端·笔记
MrSYJ41 分钟前
UserDetailService是在什么环节生效的,为什么自定义之后就能被识别
java·spring boot·后端
teeeeeeemo2 小时前
如何做HTTP优化
前端·网络·笔记·网络协议·http
long3162 小时前
构建者设计模式 Builder
java·后端·学习·设计模式
吐个泡泡v2 小时前
Maven 核心命令详解:compile、exec:java、package 与 IDE Reload 机制深度解析
java·ide·maven·mvn compile
天上掉下来个程小白2 小时前
微服务-01.导入黑马商城
java·微服务·架构
Noii.2 小时前
Spring Boot初级概念及自动配置原理
java·spring boot·后端
探索java2 小时前
Tomcat Server 组件原理
java·后端·tomcat
勿在浮沙筑高台2 小时前
无法获取实体类com.example.springdemo2.entity.po.UserPO对应的表名!
java·spring boot·mybatis