SpringDataElasticsearch
SpringDataElasticsearch
是SpringData模块的一个子模块,是对ES原生API的二次封装.
由于SpringData版本与ES版本有相关的依赖性.所以集成会有坑.以此记录
SpringBoot
,SpringData
,ES
各个版本的支持情况
本文编写时候ES最新版已经是7.6.1,但是SpringData最高只支持到6.8.4,所以需要慎重选择
在下文的示例中,使用的版本如下
- Elasticsearch:
6.8.4
- SpringBoot:
2.2.5.RELEASE
- SpringDataElasticSearch:
2.2.5.RELEASE
Docker安装ES
示例为Docker安装ES,其他方式请参考官网ES下载
1.Docker拉取镜像
docker pull elasticsearch:6.8.4
2.启动Docker
docker run --name "es6.8.4" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.4 -d
有类似输出证明docker启动ES成功
SpringBoot工程使用ES
1.添加SpringBoot依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
2.添加SpringDataElasticsearch依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.配置ES
连接
application.yml
spring:
redis:
cluster:
nodes: 127.0.0.1:9300
配置请求的日志
在初学或者排查请求问题的时候,日志是非常重要的,但是官方文档或者网上有很难找到教程...在翻看源码后终于找到解决办法
在SpringData的官方文档中,只给出了Client Logging的配置方式,配置之后只能输出请求es的接口地址.
日志输出类org.elasticsearch.client.RequestLogger
查看源码后发现,RestClient输出日志的logger使用了不同的Log对象,如果想输出详细的request
和response
日志,需要使用tracer
配置logback.xml/log4j2.xml
根据自己的项目使用的log依赖配置.这里使用logback参考
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{ISO8601}] [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="WARN">
<appender-ref ref="STDOUT"/>
</root>
<!--输出完整的请求es日志-->
<logger name="tracer" level="TRACE" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<!-- 输出restClient的日志 -->
<logger name="org.elasticsearch.client.RestClient" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
</configuration>
Demo
Country
@Document(indexName = "world")
public class Country implements Serializable {
@Id
private Integer id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Country{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
CountryRepository
public interface CountryRepository extends ElasticsearchRepository<Country, Long> {
List<Country> findCountryByName(String name);
Page<Country> findCountryByName(String name, Pageable pageable);
Country findCountryById(String name);
}
CountryTest
@RunWith(SpringRunner.class)
@SpringBootTest
class CountryServiceTest {
@Autowired
private CountryRepository countryRepository;
@Test
void saveCountry() {
Country country = new Country();
country.setName("中国");
countryRepository.save(country);
Country country1 = new Country();
country1.setName("美国");
countryRepository.save(country1);
}
@Test
public void testDel(){
countryRepository.deleteAll();
}
@Test
void getCountryByName() {
Page<Country> countryList = countryRepository.findCountryByName("国", PageRequest.of(0, 10));
System.out.println(countryList.getContent());
}
}