SpringDataElasticSearch(一)

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

3.訪問http://localhost:9200/

正常顯示

有類似輸出證明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ì)的requestresponse日志,需要使用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());
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容