5.1 入門整合案例(SpringBoot+Spring-data-elasticsearch) ---- good


本節講解SpringBoot與Spring-data-elasticsearch整合的入門案例。

一、環境搭建

新建maven項目,名字隨意

pom.xml

  1.         <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.3.1.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-test</artifactId>
  18. </dependency>
  19. </dependencies>

application.yml

  1. spring: 
  2.      data:
  3.         elasticsearch: #ElasticsearchProperties
  4.             cluster-name: elasticsearch #默認即為elasticsearch
  5.             cluster-nodes: 120.25.194.233:9300 #配置es節點信息,逗號分隔,如果沒有指定,則啟動ClientNode

這些配置的屬性,最終會設置到org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties這個實體中。

二、創建實體

Spring-data-elasticsearch為我們提供了@Document@Field等注解,如果某個實體需要建立索引,只需要加上這些注解即可。例如以一個文章實體為例:

Article.java

  1. import java.io.Serializable;
  2. import java.util.Date;
  3.  
  4. import org.springframework.data.annotation.Id;
  5. import org.springframework.data.elasticsearch.annotations.DateFormat;
  6. import org.springframework.data.elasticsearch.annotations.Document;
  7. import org.springframework.data.elasticsearch.annotations.Field;
  8.  
  9. @Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
  10. public class Article implements Serializable{
  11. /**
  12.  * 
  13.  */
  14. private static final long serialVersionUID = 551589397625941750L;
  15. @Id
  16. private Long id;
  17. /**標題*/
  18. private String title;
  19. /**摘要*/
  20. private String abstracts;
  21. /**內容*/
  22. private String content;
  23. /**發表時間*/
  24. @Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
  25. private Date postTime;
  26. /**點擊率*/
  27. private Long clickCount;
  28. //setters and getters
  29. //toString
  30. }

在需要建立索引的類上加上@Document注解,即表明這個實體需要進行索引。其定義如下:

  1. @Persistent
  2. @Inherited
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Target({ElementType.TYPE})
  5. public @interface Document {
  6.  
  7. String indexName();//索引庫的名稱,個人建議以項目的名稱命名
  8.  
  9. String type() default "";//類型,個人建議以實體的名稱命名
  10.  
  11. short shards() default 5;//默認分區數
  12.  
  13. short replicas() default 1;//每個分區默認的備份數
  14.  
  15. String refreshInterval() default "1s";//刷新間隔
  16.  
  17. String indexStoreType() default "fs";//索引文件存儲類型
  18. }

加上了@Document注解之后,默認情況下這個實體中所有的屬性都會被建立索引、並且分詞。

我們通過@Field注解來進行詳細的指定,如果沒有特殊需求,那么只需要添加@Document即可。在我們的案例中,使用了@Field針對日期屬性postTime上進行了指定。

@Field注解的定義如下:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. @Documented
  4. @Inherited
  5. public @interface Field {
  6.  
  7. FieldType type() default FieldType.Auto;#自動檢測屬性的類型
  8.  
  9. FieldIndex index() default FieldIndex.analyzed;#默認情況下分詞
  10.  
  11. DateFormat format() default DateFormat.none;
  12.  
  13. String pattern() default "";
  14.  
  15. boolean store() default false;#默認情況下不存儲原文
  16.  
  17. String searchAnalyzer() default "";#指定字段搜索時使用的分詞器
  18.  
  19. String indexAnalyzer() default "";#指定字段建立索引時指定的分詞器
  20.  
  21. String[] ignoreFields() default {};#如果某個字段需要被忽略
  22.  
  23. boolean includeInParent() default false;
  24. }

需要注意的是,這些默認值指的是我們沒有在我們沒有在屬性上添加@Filed注解的默認處理。一旦添加了@Filed注解,所有的默認值都不再生效。此外,如果添加了@Filed注解,那么type字段必須指定。

 

三 創建Repository

我們只要編寫一個接口ArticleSearchRepository,來繼承Spring-data-elasticSearch提供的ElasticsearchRepository即可。

  1. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  2.  
  3. import spring.data.elasticsearch.docs.Article;
  4.  
  5. //泛型的參數分別是實體類型和主鍵類型
  6. public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long>{
  7.  
  8. }

四、編寫測試類

1、測試自動創建mapping

ArticleSearchRepositoryTest.java

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(classes=Application.class)
  3. public class ArticleSearchRepositoryTest {
  4.  
  5. @Autowired
  6. private ArticleSearchRepository articleSearchRepository;
  7. @Test
  8. public void test(){
  9. System.out.println("演示初始化");
  10. }
  11.  
  12. }

這個測試僅僅是為了演示應用啟動后,Spring-data-elasticSearch會自動幫我們建立索引庫和創建實體的mapping信息。

當成功啟動之后,通過sense控制台查看映射信息

QQ截圖20160317013610.png

可以右邊的結果中,的確出現了article的,mapping信息。

默認情況下,在創建mapping信息的時候,只會創建添加了@Field注解的mapping信息。其他沒有添加@Filed注解的字段在保存索引的時候自動確定。

需要注意的是,mapping信息可以自動創建,但是不能自動更新,也就是說,如果需要重新進行mapping映射的話,需要將原來的刪除,再進行mapping映射。讀者可以嘗試一下將postTime的type改為FieldType.long,這種情況下,會自動將日期轉換成時間戳。但是mapping信息不會自動更新,必須將原有的mapping信息刪除之后,才能重新建立映射。

2、測試保存

  1. @Test
  2. public void testSave(){
  3. Article article=new Article();
  4. article.setId(1L);
  5. article.setTitle("elasticsearch教程");
  6. article.setAbstracts("spring-data-elastichSearch");
  7. article.setContent("SpringBoot與spring-data-elastichSearch整合");
  8. article.setPostTime(new Date());
  9. article.setClickCount(100l);
  10. articleSearchRepository.save(article);
  11. }

運行程序后,我們首先查看mapping信息有沒有自動創建

QQ截圖20160317014727.png

此時查看創建的索引結果

QQ截圖20160317014853.png

 
 
 http://www.tianshouzhi.com/api/tutorials/elasticsearch/159

限定查詢結果集大小

Spring Data允許開發者使用firsttop關鍵字對返回的查詢結果集大小進行限定。fisrt和top需要跟着一個代表返回的結果集的最大大小的數字。如果沒有跟着一個數字,那么返回的結果集大小默認為1。

Example 8.Limiting the result size of query with Top and First(利用first和top限制返回的結果集大小)

User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<User> queryFirst10ByLastname(String lastname, Pageable pageable); Slice<User> findTop3ByLastname(String lastname, Pageable pageable); List<User> findFirst10ByLastname(String lastname, Sort sort); List<User> findTop10ByLastname(String lastname, Pageable pageable); 

限制結果集的表達式還支持Distinct關鍵字。並且,當返回的結果集大小限制為1時,Spring Data支持將返回結果包裝到Optional(java 8新增,這是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象)之中,例子如下:

Optional<User> findFirstByOrderByLastnameAsc(); 

在查詢用page和slice來進行分頁查詢的情況下,同樣可以使用firsttop來對結果集大小進行限制。

+

 

注意,如果在使用Sort參數對查詢結果進行排序的基礎上加上對結果集大小的限制,就可以輕易的獲得最大的K個元素或最小的K個元素。

 

https://es.yemengying.com/4/4.4/4.4.5.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM