elasticsearch入門到放棄之spring-data-elasticsearch實踐

代碼地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-elasticsearch/spring-boot-data-elasticsearch

這篇主要是對上篇elasticsearch入門到放棄之springboot elasticsearch x-pack的補充,下面我將按照場景結合官方編寫接口,同樣我也是開啓了x-pack安全認證

系列文章

參考文檔

環境信息、配置

  • jdk 1.8
  • elasticsearch 6.4.0
  • x-pack 6.4.0
  • spring-boot-starter-data-elasticsearch 6.4.0
  • spring-boot 2.1.0 (它默認帶的elasticsearch是6.2.2的)

pom.xml文件

 <!--修改es版本這樣設置最簡單-->
<properties>
    <elasticsearch.version>6.4.0</elasticsearch.version>
</properties>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>x-pack-transport</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

<!--這個好像要添加不然下載不到 spring-boot-starter-data-elasticsearch:6.4.0 -->
<repository>
    <id>spring-libs-snapshot</id>
    <name>Spring Snapshot Repository</name>
    <url>https://repo.spring.io/libs-snapshot</url>
</repository>

application.yml配置

spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-nodes: 127.0.0.1:9300 # 集羣模式下用逗號分開
      cluster-name: elasticsearch
      properties:
        xpack.security.user: elastic:123456

使用場景

根據名稱獲取文章

注意:如果返回值是Page對象則參數必須添加Pageable

// 帶分頁信息 
Page<Article> articles = articleService.findArticleByName("docker搭建", PageRequest.of(0, 5));

// 只關心數據本身(使用場景還沒有想到)
List<Article> articles= articleService.findArticleByName(String name);

根據名稱獲取文章,然後根據id和創建時間倒序

注意:排序的時候不要用在字段類型是text上,具體原因看可能遇到的問題第一個

// 按照`org.springframework.data.domain.Sort`來
Page<Article> articles = articleService.findArticleByName("docker搭建", PageRequest.of(0, 5,Sort.by(Sort.Direction.DESC,"id","createTime")));

// 按照命名規則來
Page<Article> articles = articleService.findArticleByNameOrderByCreateTimeDesc("docker搭建", PageRequest.of(0, 5));

統計文章名稱出現次數

使用場景好像沒有,瞭解即可

 Long count = articleService.countArticleByName("docker搭建");

刪除文章

有很多方法,只寫使用頻率高的

//無返回值刪除
articleService.deleteById("40");
// 根據對象刪除
articleService.delete(new Article());
//有返回值刪除,只能針對主鍵
List<Article> articles = articleService.deleteArticlesById("40");

其他未驗證的感覺沒有使用場景的

  • 根據topfirst限制
  • 使用註解@Query

可能遇到的問題

  • java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.

這個問題是因爲Sort的字段nametext類型的,按照官方fieldata的建議,它禁止這樣操作,容易出現內存過大

// fielddata = true 可以解決這個問題,但是可能帶來oom問題
@Field(type = FieldType.Text,fielddata = true,store = true, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
private String name;

最後

如果你想了解更多的文章可以微信搜索zhaoyx92,或者掃碼關注.別抱有太高期望,更新很慢的
zhaoyx92

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章