SpringDataElasticsearch
SpringDataElasticsearch是SpringData模塊的一個(gè)子模塊,是對ES原生API的二次封裝.
由于SpringData版本與ES版本有相關(guān)的依賴性.所以集成會有坑.以此記錄
SpringBoot,SpringData,ES各個(gè)版本的支持情況
本文編寫時(shí)候ES最新版已經(jīng)是7.6.1,但是SpringData最高只支持到6.8.4,所以需要慎重選擇

各個(gè)版本的支持
在下文的示例中,使用的版本如下
- Elasticsearch:
6.8.4 - SpringBoot:
2.2.5.RELEASE - SpringDataElasticSearch:
2.2.5.RELEASE
Docker安裝ES
示例為Docker安裝ES,其他方式請參考官網(wǎng)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
配置請求的日志
在初學(xué)或者排查請求問題的時(shí)候,日志是非常重要的,但是官方文檔或者網(wǎng)上有很難找到教程...在翻看源碼后終于找到解決辦法
在SpringData的官方文檔中,只給出了Client Logging的配置方式,配置之后只能輸出請求es的接口地址.
日志輸出類org.elasticsearch.client.RequestLogger
查看源碼后發(fā)現(xiàn),RestClient輸出日志的logger使用了不同的Log對象,如果想輸出詳細(xì)的request和response日志,需要使用tracer
配置logback.xml/log4j2.xml
根據(jù)自己的項(xiàng)目使用的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());
}
}