入門整合案例(SpringBoot+Spring-data-elasticsearch) ---- (指定分詞器)
本節講解SpringBoot與Spring-data-elasticsearch整合的入門案例。
一、環境搭建
新建maven專案,名字隨意
pom.xml
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.3.1.RELEASE</version>
- </parent>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- </dependency>
- </dependencies>
application.yml
- spring:
- data:
- elasticsearch: #ElasticsearchProperties
- cluster-name: elasticsearch #預設即為elasticsearch
- cluster-nodes: 120.25.194.233:9300 #配置es節點資訊,逗號分隔,如果沒有指定,則啟動ClientNode
這些配置的屬性,最終會設定到org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties
這個實體中。
二、建立實體
Spring-data-elasticsearch為我們提供了@Document
、@Field
等註解,如果某個實體需要建立索引,只需要加上這些註解即可。例如以一個文章實體為例:
Article.java
- import java.io.Serializable;
- import java.util.Date;
- import org.springframework.data.annotation.Id;
- import org.springframework.data.elasticsearch.annotations.DateFormat;
- import org.springframework.data.elasticsearch.annotations.Document;
- import org.springframework.data.elasticsearch.annotations.Field;
- @Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
- public class Article implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = 551589397625941750L;
- @Id
- private Long id;
- /**標題*/
- private String title;
- /**摘要*/
- private String abstracts;
- /**內容*/
- private String content;
- /**發表時間*/
- @Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
- private Date postTime;
- /**點選率*/
- private Long clickCount;
- //setters and getters
- //toString
- }
在需要建立索引的類上加上@Document
註解,即表明這個實體需要進行索引。其定義如下:
- @Persistent
- @Inherited
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE})
- public @interface Document {
- String indexName();//索引庫的名稱,個人建議以專案的名稱命名
- String type() default "";//型別,個人建議以實體的名稱命名
- short shards() default 5;//預設分割槽數
- short replicas() default 1;//每個分割槽預設的備份數
- String refreshInterval() default "1s";//重新整理間隔
- String indexStoreType() default "fs";//索引檔案儲存型別
- }
加上了@Document
註解之後,預設情況下這個實體中所有的屬性都會被建立索引、並且分詞。
我們通過@Field
註解來進行詳細的指定,如果沒有特殊需求,那麼只需要新增@Document即可。在我們的案例中,使用了@Field針對日期屬性postTime上進行了指定。
@Field註解的定義如下:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.FIELD)
- @Documented
- @Inherited
- public @interface Field {
- FieldType type() default FieldType.Auto;#自動檢測屬性的型別
- FieldIndex index() default FieldIndex.analyzed;#預設情況下分詞
- DateFormat format() default DateFormat.none;
- String pattern() default "";
- boolean store() default false;#預設情況下不儲存原文
- String searchAnalyzer() default "";#指定欄位搜尋時使用的分詞器
- String indexAnalyzer() default "";#指定欄位建立索引時指定的分詞器
- String[] ignoreFields() default {};#如果某個欄位需要被忽略
- boolean includeInParent() default false;
- }
需要注意的是,這些預設值指的是我們沒有在我們沒有在屬性上新增@Filed
註解的預設處理。一旦添加了@Filed註解,所有的預設值都不再生效。此外,如果添加了@Filed
註解,那麼type
欄位必須指定。
三 建立Repository
我們只要編寫一個介面ArticleSearchRepository,來繼承Spring-data-elasticSearch提供的ElasticsearchRepository
即可。
- import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
- import spring.data.elasticsearch.docs.Article;
- //泛型的引數分別是實體型別和主鍵型別
- public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long>{
- }
四、編寫測試類
1、測試自動建立mapping
ArticleSearchRepositoryTest.java
- @RunWith(SpringJUnit4ClassRunner.class)
- @SpringApplicationConfiguration(classes=Application.class)
- public class ArticleSearchRepositoryTest {
- @Autowired
- private ArticleSearchRepository articleSearchRepository;
- @Test
- public void test(){
- System.out.println("演示初始化");
- }
- }
這個測試僅僅是為了演示應用啟動後,Spring-data-elasticSearch會自動幫我們建立索引庫和建立實體的mapping資訊。
當成功啟動之後,通過sense控制檯檢視對映資訊
可以右邊的結果中,的確出現了article的,mapping資訊。
預設情況下,在建立mapping資訊的時候,只會建立添加了@Field註解的mapping資訊。其他沒有新增@Filed註解的欄位在儲存索引的時候自動確定。
需要注意的是,mapping資訊可以自動建立,但是不能自動更新,也就是說,如果需要重新進行mapping對映的話,需要將原來的刪除,再進行mapping對映。讀者可以嘗試一下將postTime的type改為FieldType.long,這種情況下,會自動將日期轉換成時間戳。但是mapping資訊不會自動更新,必須將原有的mapping資訊刪除之後,才能重新建立對映。
2、測試儲存
- @Test
- public void testSave(){
- Article article=new Article();
- article.setId(1L);
- article.setTitle("elasticsearch教程");
- article.setAbstracts("spring-data-elastichSearch");
- article.setContent("SpringBoot與spring-data-elastichSearch整合");
- article.setPostTime(new Date());
- article.setClickCount(100l);
- articleSearchRepository.save(article);
- }
執行程式後,我們首先檢視mapping資訊有沒有自動建立
此時檢視建立的索引結果