1. 程式人生 > >入門整合案例(SpringBoot+Spring-data-elasticsearch) ---- (指定分詞器)

入門整合案例(SpringBoot+Spring-data-elasticsearch) ---- (指定分詞器)

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

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

  1. @Persistent
  2. @Inherited
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Target({ElementType.TYPE})
  5. public @interface Document {
  6. String indexName();//索引庫的名稱,個人建議以專案的名稱命名
  7. String type() default "";//型別,個人建議以實體的名稱命名
  8. short shards() default 5;//預設分割槽數
  9. short replicas() default 1;//每個分割槽預設的備份數
  10. String refreshInterval() default "1s";//重新整理間隔
  11. String indexStoreType() default "fs";//索引檔案儲存型別
  12. }

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

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

@Field註解的定義如下:

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

需要注意的是,這些預設值指的是我們沒有在我們沒有在屬性上新增@Filed註解的預設處理。一旦添加了@Filed註解,所有的預設值都不再生效。此外,如果添加了@Filed註解,那麼type欄位必須指定。

三 建立Repository

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

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

四、編寫測試類

1、測試自動建立mapping

ArticleSearchRepositoryTest.java

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

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

當成功啟動之後,通過sense控制檯檢視對映資訊

可以右邊的結果中,的確出現了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資訊有沒有自動建立

此時檢視建立的索引結果