Spring Boot整合elasticsearch的详细步骤

网友投稿 344 2023-01-09


Spring Boot整合elasticsearch的详细步骤

一、简介

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

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

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

二、安装elasticsearch

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

#下载镜像

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 集群可以 包含多个索引 ,相应的nPEWy每个索引可以包含多个类型。这些不同的类型存储着多个文档 ,每个文档又有 多个 属性 。

类似关系:

索引-数据库

类型-表

文档-表中的记录 – 属性-列

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

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.gf

springboot-elasticsearch

0.0.1-SNAPSHOT

jar

springboot-elasticsearch

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter-data-elasticsearch

io.searchbox

jest

5.3.3

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.gf

springboot-elasticsearch

0.0.1-SNAPSHOT

jar

springboot-elasticsearch

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter-data-elasticsearch

io.searchbox

jest

5.3.3

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

2. application.properties

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

3. Article

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测试类

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

spring.data.elasticsearch.cluster-name=elasticsearch

spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

2. Book

package com.gf.entity;

@Document( indexName = "gf" , type = "book")

public class Book {

private Integer id;

private String bookName;

private String author;

public IntnPEWyeger 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

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{

List findByBookNameLike(String bookName);

}

4. springboot 测试类

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

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的配置了

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化接口测试方案(常用的接口自动化测试框架)
下一篇:子类继承父类的实现接口吗(一个类继承了父类,就不能实现接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~