上一篇介绍Elasticsearch7.5的破解方法,结果csdn现在莫名其妙不支持破解、激活类博文公开,审核没有通过。不过网上也有其他版本的破解方式,新版本也就一些细节区别,有需要的也可以后面留言。
这节我们接着第三节写下Elasticsearch结合mybatis的实例。maven依赖x-pack-sql-jdbc
需要加上,还要记得配置repository
,因为中央仓没有发布。
@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();
}
}
<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毫秒。
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
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);
}
@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。
springboot是提供了些常见的CRUD,简单的需求使用人家封装好的工具就已经完全够用了,可惜还不能支持es7之后版本。当然选用原生的api或者sql,也是一种不错的选择,比如某些需求场景下只有原生api能很好支持,比如大数据量下的更新。