一、简介
我们的应用经常需要添加检索功能,开源的 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://www.w3.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.com/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.com/gf-huanchupk/springbootlearning
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。