1、環境准備
我本地使用的環境為:
虛擬機版本:Centos 7.3 兩台 IP 分別為:192.168.56.12, 192.168.56.13
Elasticsearch版本:6.4.0 (已安裝IK分詞器)
虛擬機中JDK版本:12.0.1
宿主機系統:Windows 10
宿主機JDK版本:1.8
Idea版本: 2019.1.3
2、創建工程
1)、在Idea中創建一個Maven工程,並導入Spring Data Elasticsearch依賴。
Spring Data Elasticsearch依賴(pom.xml):
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6
7 <groupId>com.Aiden</groupId>
8 <artifactId>SpringData-elasticsearch</artifactId>
9 <version>1.0-SNAPSHOT</version>
10
11 <dependencies>
12 <dependency>
13 <groupId>org.elasticsearch</groupId>
14 <artifactId>elasticsearch</artifactId>
15 <version>5.6.8</version>
16 </dependency>
17 <dependency>
18 <groupId>org.elasticsearch.client</groupId>
19 <artifactId>transport</artifactId>
20 <version>5.6.8</version>
21 </dependency>
22 <dependency>
23 <groupId>org.apache.logging.log4j</groupId>
24 <artifactId>log4j-to-slf4j</artifactId>
25 <version>2.9.1</version>
26 </dependency>
27 <dependency>
28 <groupId>org.slf4j</groupId>
29 <artifactId>slf4j-api</artifactId>
30 <version>1.7.24</version>
31 </dependency>
32 <dependency>
33 <groupId>org.slf4j</groupId>
34 <artifactId>slf4j-simple</artifactId>
35 <version>1.7.21</version>
36 </dependency>
37 <dependency>
38 <groupId>log4j</groupId>
39 <artifactId>log4j</artifactId>
40 <version>1.2.12</version>
41 </dependency>
42 <dependency>
43 <groupId>junit</groupId>
44 <artifactId>junit</artifactId>
45 <version>4.12</version>
46 </dependency>
47
48
49 <dependency>
50 <groupId>com.fasterxml.jackson.core</groupId>
51 <artifactId>jackson-core</artifactId>
52 <version>2.8.1</version>
53 </dependency>
54 <dependency>
55 <groupId>com.fasterxml.jackson.core</groupId>
56 <artifactId>jackson-databind</artifactId>
57 <version>2.8.1</version>
58 </dependency>
59 <dependency>
60 <groupId>com.fasterxml.jackson.core</groupId>
61 <artifactId>jackson-annotations</artifactId>
62 <version>2.8.1</version>
63 </dependency>
64
65
66 <dependency>
67 <groupId>org.springframework.data</groupId>
68 <artifactId>spring-data-elasticsearch</artifactId>
69 <version>3.0.5.RELEASE</version>
70 <exclusions>
71 <exclusion>
72 <groupId>org.elasticsearch.plugin</groupId>
73 <artifactId>transport-netty4-client</artifactId>
74 </exclusion>
75 </exclusions>
76 </dependency>
77
78 <dependency>
79 <groupId>org.springframework</groupId>
80 <artifactId>spring-test</artifactId>
81 <version>5.0.4.RELEASE</version>
82 </dependency>
83
84 </dependencies>
85
86
87 </project>
2)、創建配置文件
在maven工程的resource目錄下創建Spring Data Elasticsearch的配置文件 ApplicationContext.xml,並引入Elasticsearch命名空間
ApplicationContext.xml文件內容:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/data/elasticsearch 12 http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd 13 ">
14
15
16 </beans>
3)、創建實體Film
在maven工程中創建包com.Aiden.doamin,並在此包下創建實體類Film
1 package com.Aiden.domain; 2
3 import org.springframework.data.annotation.Id; 4 import org.springframework.data.elasticsearch.annotations.Document; 5 import org.springframework.data.elasticsearch.annotations.Field; 6 import org.springframework.data.elasticsearch.annotations.FieldType; 7
8 public class Film { 9
10 private Long id; 11 private String title; 12 private String content; 13 private String date; 14 private String price; 15 private String director; 16
17 public Long getId() { 18 return id; 19 } 20
21 public void setId(Long id) { 22 this.id = id; 23 } 24
25 public String getTitle() { 26 return title; 27 } 28
29 public void setTitle(String title) { 30 this.title = title; 31 } 32
33 public String getContent() { 34 return content; 35 } 36
37 public void setContent(String content) { 38 this.content = content; 39 } 40
41 public String getDate() { 42 return date; 43 } 44
45 public void setDate(String date) { 46 this.date = date; 47 } 48
49 public String getPrice() { 50 return price; 51 } 52
53 public void setPrice(String price) { 54 this.price = price; 55 } 56
57 public String getDirector() { 58 return director; 59 } 60
61 public void setDirector(String director) { 62 this.director = director; 63 } 64
65 @Override 66 public String toString() { 67 return "Film{" +
68 "id=" + id +
69 ", title='" + title + '\'' +
70 ", content='" + content + '\'' +
71 ", date='" + date + '\'' +
72 ", price='" + price + '\'' +
73 ", director='" + director + '\'' +
74 '}'; 75 } 76 }
4)、創建Dao
在maven工程中創建com.Aiden.dao包,並在包中創建倉庫 FilmRepository
1 package com.Aiden.dao; 2
3 import com.Aiden.domain.Film; 4 import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 import org.springframework.stereotype.Repository; 6
7 @Repository 8 public interface FilmRepository extends ElasticsearchRepository<Film,Long> { 9
10 }
5)、創建Service
在maven工程中創建com.Aiden.service包,並在包中創建 FilmService 接口,並在其中添加save方法
1 package com.Aiden.service; 2
3 import com.Aiden.domain.Film; 4
5 public interface FilmService { 6
7 public void save(Film film); 8
9 }
在剛創建的service包下創建Impl包(即com.Aiden.service.Impl包),並在此包中創建FilmServiceImpl類並實現FilmService接口,實現其方法
1 package com.Aiden.service.impl; 2
3 import com.Aiden.dao.FilmRepository; 4 import com.Aiden.domain.Film; 5 import com.Aiden.service.FilmService; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Service; 8
9 @Service 10 public class FilmServiceImpl implements FilmService { 11
12 @Autowired 13 private FilmRepository filmRepository; 14
15 public void save(Film film) { 16 filmRepository.save(film); 17 } 18
19 }
6)、修改Spring Data Elasticsearch配置文件ApplicationContext.xml,完成項目配置
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/data/elasticsearch 12 http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd 13 ">
14
15 <!-- 掃描Dao包,自動創建實例 -->
16 <elasticsearch:repositories base-package="com.Aiden.dao"/>
17
18 <!-- 掃描Service包,創建Service的實體 -->
19 <context:component-scan base-package="com.Aiden.service"/>
20
21 <!-- 配置elasticSearch的連接 -->
22 <elasticsearch:transport-client id="client" cluster-nodes="192.168.56.12:9300,192.168.56.13:9300" cluster-name="my-application"/>
23
24
25 <!-- ElasticSearch模版對象 -->
26 <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
27 <constructor-arg name="client" ref="client"/>
28 </bean>
29
30 </beans>
7)、配置實體類
基於spring data elasticsearch注解配置索引、映射和實體的關系
1 package com.Aiden.domain; 2
3 import org.springframework.data.annotation.Id; 4 import org.springframework.data.elasticsearch.annotations.Document; 5 import org.springframework.data.elasticsearch.annotations.Field; 6 import org.springframework.data.elasticsearch.annotations.FieldType; 7
8 @Document(indexName = "film",type = "action") 9 public class Film { 10 @Id 11 private Long id; 12 @Field(index = true,analyzer = "ik_max_word",store = true,searchAnalyzer = "ik_max_word",type = FieldType.text) 13 private String title; 14 @Field(index = true,analyzer = "ik_max_word",store = true,searchAnalyzer = "ik_max_word",type = FieldType.text) 15 private String content; 16 @Field(index = true,analyzer = "ik_max_word",store = true,searchAnalyzer = "ik_max_word",type = FieldType.text) 17 private String date; 18 @Field(index = true,analyzer = "ik_max_word",store = true,searchAnalyzer = "ik_max_word",type = FieldType.text) 19 private String price; 20 @Field(index = true,analyzer = "ik_max_word",store = true,searchAnalyzer = "ik_max_word",type = FieldType.text) 21 private String director; 22
23 public Long getId() { 24 return id; 25 } 26
27 public void setId(Long id) { 28 this.id = id; 29 } 30
31 public String getTitle() { 32 return title; 33 } 34
35 public void setTitle(String title) { 36 this.title = title; 37 } 38
39 public String getContent() { 40 return content; 41 } 42
43 public void setContent(String content) { 44 this.content = content; 45 } 46
47 public String getDate() { 48 return date; 49 } 50
51 public void setDate(String date) { 52 this.date = date; 53 } 54
55 public String getPrice() { 56 return price; 57 } 58
59 public void setPrice(String price) { 60 this.price = price; 61 } 62
63 public String getDirector() { 64 return director; 65 } 66
67 public void setDirector(String director) { 68 this.director = director; 69 } 70
71 @Override 72 public String toString() { 73 return "Film{" +
74 "id=" + id +
75 ", title='" + title + '\'' +
76 ", content='" + content + '\'' +
77 ", date='" + date + '\'' +
78 ", price='" + price + '\'' +
79 ", director='" + director + '\'' +
80 '}'; 81 } 82 }
8)、創建測試類
在maven工程的test文件夾下創建測試類 SpringDataElasticSearchTest,並添加測試方法
1 package com.Aiden.Test; 2
3 import com.Aiden.domain.Film; 4 import com.Aiden.service.FilmService; 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; 9 import org.springframework.test.context.ContextConfiguration; 10 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11
12 import java.util.List; 13
14
15 @RunWith(SpringJUnit4ClassRunner.class) 16 @ContextConfiguration(locations = "classpath:ApplicationContext.xml") 17 public class SpringDataElasticSearchTest { 18
19 @Autowired 20 private FilmService filmService; 21
22 @Autowired 23 private ElasticsearchTemplate elasticsearchTemplate; 24
25 @Test 26 public void createIndex() throws Exception { 27 elasticsearchTemplate.createIndex(Film.class); 28 elasticsearchTemplate.putMapping(Film.class); 29 } 30
31 @Test 32 public void saveFilm1() { 33 Film film = new Film(); 34 film.setTitle("蜘蛛俠:英雄遠征 Spider-Man: Far from Home"); 35 film.setContent("在復仇者聯盟眾英雄的努力下,於滅霸無限手套事件中化作為灰燼的人們,重新回到了人世間,曾經消失的蜘蛛俠 彼得帕克 也回歸到了普通的生活之中,數月后,蜘蛛俠彼得帕克所在的學校舉行了歐洲旅游,帕克也在其中, 在歐州威尼斯旅行時,一個巨大無比的水怪襲擊了威尼斯,不敵敵人的蜘蛛俠幸得一位自稱神秘客的男子搭救才擊退敵人,之后 神盾局局長找上正在旅游的彼得帕克並要求其加入神盾局,並安排神秘客協助帕克,神秘客自稱來自其他宇宙,並告知一群名為元素眾的邪惡勢力已經入侵這個宇宙了,為了守護來之不易的和平,蜘蛛俠決定與神秘客聯手,然而在神秘客那頭罩之中,似乎隱藏着什么不為人知的真相……"); 36 film.setDate("2019-06-28"); 37 film.setDirector("喬·沃茨"); 38 film.setPrice("78"); 39 film.setId(1L); 40 filmService.save(film); 41 } 42
43 }
9)、運行測試
執行SpringDataElasticSearchTest中的測試方法 createIndex 、saveFilm1,創建索引及加入文檔。
測試方法執行完畢,在head插件中查看Elasticsearch集群中索引情況:
索引創建成功:
查看索引信息中的mapping信息,創建正常:
執行saveFilm1加入文檔,文檔加入成功:
至此Spring Data Elasticsearch工程創建成功!