最新elasticsearch7(五、结合mybatis、springboot实例)

文章目录

    • 前言
    • DataSource配置
    • mybatis脚本
    • 单元测试
    • springboot
        • 配置
        • 多个异常
        • 方法

前言

上一篇介绍Elasticsearch7.5的破解方法,结果csdn现在莫名其妙不支持破解、激活类博文公开,审核没有通过。不过网上也有其他版本的破解方式,新版本也就一些细节区别,有需要的也可以后面留言。
这节我们接着第三节写下Elasticsearch结合mybatis的实例。maven依赖x-pack-sql-jdbc需要加上,还要记得配置repository,因为中央仓没有发布。

DataSource配置

@Configuration
@MapperScan(basePackages={"com.yds.datacenter.dao.es"}, sqlSessionFactoryRef="esSqlSessionFactory")
public class ElasticsearchConfig {

    @Bean(name = "esDataSource")
    public DataSource clickHouseDataSource() {
        EsDataSource dataSource = new EsDataSource();
        String address = "jdbc:es://192.168.9.226:9200";
        dataSource.setUrl(address);
        Properties connectionProperties = new Properties();
        dataSource.setProperties(connectionProperties);
        return dataSource;
    }

    @Bean(name = "esSqlSessionFactory")
    public SqlSessionFactory clickHouseSqlSessionFactory(@Qualifier("esDataSource") DataSource esDateSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(esDateSource);
        sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        return sessionFactory.getObject();
    }
}

mybatis脚本

    <select id="query" parameterType="java.lang.String" resultType="com.tt.datacenter.utils.es.Person">
        ${param1}
    </select>

    <select id="count" resultType="java.lang.Long">
        select count(*) from person
    </select>

单元测试

我这里先插入了索引名为Person的测试数据1亿条,然后用sql查询总数,再随机条件查询一组数据,避免缓存影响。可以看到总数有1.34亿多条,我们随机查询的时间是328毫秒。

最新elasticsearch7(五、结合mybatis、springboot实例)_第1张图片

springboot

配置

  • pom依赖
    结合springboot需要添加自己项目对应版本的依赖,我这边用的是2.1.0.RELEASE
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>7.5.1</version>
        </dependency>
  • 配置
    添加自己的集群配置
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true
  • Dao
    Dao继承ElasticsearchRepository
/**
 * create by sun
 * v1.0
 * 2020/2/11
 * param:
 *      PersonPo 实体类
 *      String为PersonPo的主键类型
 */
public interface PersonMapper extends ElasticsearchRepository<PersonPo,String>{
//    Long count();

//    List query(@Param("param1")String sql);
}
  • personPo
@Document(indexName = "person")
@Data
public class PersonPo {

}

多个异常

 Failed to instantiate [org.elasticsearch.client.transport.TransportClient]: 
 Factory method 'elasticsearchClient' threw exception;

通过创建ElasticSearchConfiguration配置

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.xxx.es")
public class ElasticSearchConfiguration {
    @Value("${elasticsearch.uris}")
    private String uris;

    @Bean(name = "esClient")
    public Client client() throws UnknownHostException {
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new TransportAddress(InetAddress.getByName(uris), 9300));
        return client;
    }

    @Bean(name = "myElasticsearchOperations")
    public ElasticsearchOperations elasticsearchTemplate(@Qualifier("esClient") Client client)  {
        return new ElasticsearchTemplate(client);
    }
}

异常2


The bean 'elasticsearchTemplate', defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class], 
could not be registered. A bean with that name has already been defined in class path resource 
[com/tt/datacenter/configuration/ElasticSearchConfiguration.class] and overriding is disabled.

修改ElasticsearchOperations 注解名称,@Bean(name = "myElasticsearchOperations")

异常3

Description:

An attempt was made to call the method org.elasticsearch.common.logging.Loggers.getLogger(Ljava/lang/String;)Lorg/apache/logging/log4j/Logger; but it does not exist. Its class, org.elasticsearch.common.logging.Loggers, is available from the following locations:

    jar:file:/Users/sun/.m2/repository/org/elasticsearch/elasticsearch/7.5.1/elasticsearch-7.5.1.jar!/org/elasticsearch/common/logging/Loggers.class

It was loaded from the following location:

    file:/Users/sun/.m2/repository/org/elasticsearch/elasticsearch/7.5.1/elasticsearch-7.5.1.jar

看似是缺少log,于是加上依赖,但仍然报错。

        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-apiartifactId>
            <version>2.13.1version>
        dependency>
        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-coreartifactId>
            <version>2.13.1version>
        dependency>

后续经过异常追踪,发现是transport-netty4-client-6.4.2.jar引起

Caused by: java.lang.NoSuchMethodError: org.elasticsearch.common.logging.Loggers.getLogger(Ljava/lang/String;)Lorg/apache/logging/log4j/Logger;
	at org.elasticsearch.transport.netty4.Netty4InternalESLogger.<init>(Netty4InternalESLogger.java:34)
	at org.elasticsearch.transport.netty4.Netty4Utils$1.newInstance(Netty4Utils.java:53)
	at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:93)
	at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:86)
	at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:69)
	at io.netty.util.ConstantPool.<init>(ConstantPool.java:32)
	at io.netty.util.AttributeKey$1.<init>(AttributeKey.java:27)
	at io.netty.util.AttributeKey.<clinit>(AttributeKey.java:27)

于是将transport版本改动6.4.2 ,这次看到了一个熟悉的异常。

Caused by: java.lang.NoClassDefFoundError: org/elasticsearch/action/GenericAction
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructors(Class.java:1651)
    at org.elasticsearch.plugins.PluginsService.loadPlugin(PluginsService.java:588)
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:119)
    at org.elasticsearch.client.transport.TransportClient.newPluginService(TransportClient.java:111)

这个问题再git的issue 已经有大佬解答、原因是GenericAction类在7.0中被合并为Action,所以依赖7.x的elasticsearch包肯定是找不到。
综上,因为starter有对TransportClient的依赖,所以要使用starter还是需要把es的版本设置到6.x。

方法

注入dao,我们可以看到很多封装好的CRUD。
最新elasticsearch7(五、结合mybatis、springboot实例)_第2张图片

springboot是提供了些常见的CRUD,简单的需求使用人家封装好的工具就已经完全够用了,可惜还不能支持es7之后版本。当然选用原生的api或者sql,也是一种不错的选择,比如某些需求场景下只有原生api能很好支持,比如大数据量下的更新。

你可能感兴趣的:(大数据,Elasticsearch,mybatis,Elasticsearch,mybatis,spring,sql,DataSource)