好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring Boot整合elasticsearch的详细步骤

一、简介

我们的应用经常需要添加检索功能,开源的 elasticsearch 是目前全文搜索引擎的 首选。他可以快速的存储、搜索和分析海量数据。spring boot通过整合spring data elasticsearch为我们提供了非常便捷的检索功能支持;

elasticsearch是一个分布式搜索服务,提供restful api,底层基于lucene,采用 多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github 等大型的站点也是采用了elasticsearch作为其搜索服务,

我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用json通过http来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用elasticsearch来解决所有这些问题及可能出现的更多其它问题。

二、安装elasticsearch

我们采用 docker镜像安装的方式。

?

1

2

3

4

5

#下载镜像

docker pull elasticsearch

#启动镜像,elasticsearch 启动是会默认分配2g的内存 ,我们启动是设置小一点,防止我们内存不够启动失败

# 9200 是elasticsearch 默认的web通信接口, 9300 是分布式情况下,elasticsearch个节点通信的端口

docker run -e es_java_opts= "-xms256m -xmx256m" -d -p 9200 : 9200 -p 9300 : 9300 --name es01 5c1e1ecfe33a

访问 127.0.0.1:9200 如下图,说明安装成功

三、elasticsearch的一些概念

以 员工文档 的形式存储为例:一个文档代表一个员工数据。存储数据到 elasticsearch 的行为叫做索引 ,但在索引一个文档之前,需要确定将文档存 储在哪里。

一个 elasticsearch 集群可以 包含多个索引 ,相应的每个索引可以包含多个类型。这些不同的类型存储着多个文档 ,每个文档又有 多个 属性 。

类似关系:

索引-数据库 类型-表 文档-表中的记录 – 属性-列

elasticsearch使用可以参早官方文档,在这里不在讲解。

四、整合 elasticsearch

创建项目 springboot-elasticsearch,引入web支持

springboot 提供了两种方式操作elasticsearch,jest 和 springdata。

jest 操作 elasticsearch

jest是elasticsearch的java http rest客户端。

elasticsearch已经有一个java api,elasticsearch也在内部使用它,但是jest填补了空白,它是elasticsearch http rest接口缺少的客户端。

1. pom.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<?xml version= "1.0" encoding= "utf-8" ?>

<project xmlns= "http://maven.apache.org/pom/4.0.0" xmlns:xsi= "http://HdhCmsTestw3.org/2001/xmlschema-instance"

   xsi:schemalocation= "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >

   <modelversion> 4.0 . 0 </modelversion>

 

   <groupid>com.gf</groupid>

   <artifactid>springboot-elasticsearch</artifactid>

   <version> 0.0 . 1 -snapshot</version>

   <packaging>jar</packaging>

 

   <name>springboot-elasticsearch</name>

   <description>demo project for spring boot</description>

 

   <parent>

     <groupid>org.springframework.boot</groupid>

     <artifactid>spring-boot-starter-parent</artifactid>

     <version> 2.1 . 1 .release</version>

     <relativepath/> <!-- lookup parent from repository -->

   </parent>

 

   <properties>

     <project.build.sourceencoding>utf- 8 </project.build.sourceencoding>

     <project.reporting.outputencoding>utf- 8 </project.reporting.outputencoding>

     <java.version> 1.8 </java.version>

   </properties>

 

   <dependencies>

     <dependency>

     <groupid>org.springframework.boot</groupid>

     <artifactid>spring-boot-starter-data-elasticsearch</artifactid>

   </dependency>

     <dependency>

       <groupid>io.searchbox</groupid>

       <artifactid>jest</artifactid>

       <version> 5.3 . 3 </version>

     </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>

       <scope>test</scope>

     </dependency>

   </dependencies>

 

   <build>

     <plugins>

       <plugin>

         <groupid>org.springframework.boot</groupid>

         <artifactid>spring-boot-maven-plugin</artifactid>

       </plugin>

     </plugins>

   </build>

</project>

2. application.properties

?

1

spring.elasticsearch.jest.uris=http: //127.0.0.1:9200

3. article

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

package com.gf.entity;

import io.searchbox.annotations.jestid;

public class article {

 

   @jestid

   private integer id;

   private string author;

   private string title;

   private string content;

 

   public integer getid() {

     return id;

   }

 

   public void setid(integer id) {

     this .id = id;

   }

 

   public string getauthor() {

     return author;

   }

 

   public void setauthor(string author) {

     this .author = author;

   }

 

   public string gettitle() {

     return title;

   }

 

   public void settitle(string title) {

     this .title = title;

   }

 

   public string getcontent() {

     return content;

   }

 

   public void setcontent(string content) {

     this .content = content;

   }

 

   @override

   public string tostring() {

     final stringbuilder sb = new stringbuilder( "{\"article\":{" );

     sb.append( "\"id\":" )

         .append( id );

     sb.append( ",\"author\":\"" )

         .append( author ).append( '\"' );

     sb.append( ",\"title\":\"" )

         .append( title ).append( '\"' );

     sb.append( ",\"content\":\"" )

         .append( content ).append( '\"' );

     sb.append( "}}" );

     return sb.tostring();

   }

}

4. springboot测试类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

package com.gf;

 

import com.gf.entity.article;

import io.searchbox.client.jestclient;

import io.searchbox.core.index;

import io.searchbox.core.search;

import io.searchbox.core.searchresult;

import org.junit.test;

import org.junit.runner.runwith;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.boot.test.context.springboottest;

import org.springframework.test.context.junit4.springrunner;

 

import java.io.ioexception;

 

@runwith (springrunner. class )

@springboottest

public class springbootelasticsearchapplicationtests {

 

   @autowired

   jestclient jestclient;

 

   @test

   public void createindex() {

     //1. 给es中索引(保存)一个文档

     article article = new article();

     article.setid( 1 );

     article.settitle( "好消息" );

     article.setauthor( "张三" );

     article.setcontent( "hello world" );

 

     //2. 构建一个索引

     index index = new index.builder( article ).index( "gf" ).type( "news" ).build();

     try {

       //3. 执行

       jestclient.execute( index );

     } catch (ioexception e) {

       e.printstacktrace();

     }

   }

 

   @test

   public void search() {

     //查询表达式

     string query = "{\n" +

         "  \"query\" : {\n" +

         "    \"match\" : {\n" +

         "      \"content\" : \"hello\"\n" +

         "    }\n" +

         "  }\n" +

         "}" ;

 

     //构建搜索功能

     search search = new search.builder( query ).addindex( "gf" ).addtype( "news" ).build();

 

     try {

       //执行

       searchresult result = jestclient.execute( search );

       system.out.println(result.getjsonstring());

     } catch (ioexception e) {

       e.printstacktrace();

     }

   }

}

jest的更多api ,可以参照github的文档: https://github测试数据/searchbox-io/jest

springdata 操作 elasticsearch

1. application.properties

?

1

2

spring.data.elasticsearch.cluster-name=elasticsearch

spring.data.elasticsearch.cluster-nodes= 127.0 . 0.1 : 9300

2. book

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package com.gf.entity;

@document ( indexname = "gf" , type = "book" )

public class book {

   private integer id;

   private string bookname;

   private string author;

 

   public integer getid() {

     return id;

   }

 

   public void setid(integer id) {

     this .id = id;

   }

 

   public string getbookname() {

     return bookname;

   }

 

   public void setbookname(string bookname) {

     this .bookname = bookname;

   }

 

   public string getauthor() {

     return author;

   }

 

   public void setauthor(string author) {

     this .author = author;

   }

 

   @override

   public string tostring() {

     final stringbuilder sb = new stringbuilder( "{\"book\":{" );

     sb.append( "\"id\":" )

         .append( id );

     sb.append( ",\"bookname\":\"" )

         .append( bookname ).append( '\"' );

     sb.append( ",\"author\":\"" )

         .append( author ).append( '\"' );

     sb.append( "}}" );

     return sb.tostring();

   } 

}

3. bookrepository

?

1

2

3

4

5

6

7

8

9

10

package com.gf.repository;

import com.gf.entity.book;

import org.springframework.data.elasticsearch.repository.elasticsearchrepository;

 

import java.util.list;

 

public interface bookrepository extends elasticsearchrepository<book, integer>{

 

   list<book> findbybooknamelike(string bookname);

}

4. springboot 测试类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.gf;

import com.gf.entity.article;

import com.gf.entity.book;

import com.gf.repository.bookrepository;

import io.searchbox.client.jestclient;

import io.searchbox.core.index;

import io.searchbox.core.search;

import io.searchbox.core.searchresult;

import org.junit.test;

import org.junit.runner.runwith;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.boot.test.context.springboottest;

import org.springframework.test.context.junit4.springrunner;

import java.io.ioexception;

import java.util.list;

 

@runwith (springrunner. class )

@springboottest

public class springbootelasticsearchapplicationtests {

   @autowired

   bookrepository bookrepository;

  

   @test

   public void createindex2(){

     book book = new book();

     book.setid( 1 );

     book.setbookname( "西游记" );

     book.setauthor( "吴承恩" );

     bookrepository.index( book );

   }

 

   @test

   public void usefind() {

     list<book> list = bookrepository.findbybooknamelike( "游" );

     for (book book : list) {

       system.out.println(book);

     }

   }

}

我们启动测试 ,发现报错 。

这个报错的原因是springdata的版本与我elasticsearch的版本有冲突,下午是springdata官方文档给出的适配表。

我们使用的springdata elasticsearch的 版本是3.1.3 ,对应的版本应该是6.2.2版本,而我们是的 elasticsearch 是 5.6.9,所以目前我们需要更换elasticsearch的版本为6.x

?

1

2

docker pull elasticsearch: 6.5 . 1

docker run -e es_java_opts= "-xms256m -xmx256m" -d -p 9200 : 9200 -p 9300 : 9300 --name es02 镜像id

访问127.0.0.1:9200

集群名为docker-cluster,所以我们要修改application.properties的配置了

?

1

2

spring.data.elasticsearch.cluster-name=docker-cluster

spring.data.elasticsearch.cluster-nodes= 127.0 . 0.1 : 9300

我们再次进行测试,测试可以通过了 。我们访问http://127.0.0.1:9200/gf/book/1,可以得到我们存入的索引信息。

源码: https://github测试数据/gf-huanchupk/springbootlearning

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

查看更多关于Spring Boot整合elasticsearch的详细步骤的详细内容...

  阅读:15次