Springboot系列之十七:整合Elasticsearch

阅读:
springboot整合ElasticSearch的API使用,以及自己总结:
https://blog.csdn.net/qq_32832227/article/details/81178415

一、检索

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

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

二、概念
以 员工文档 的形式存储为例:

一个文档代表一个员工数据。
存储数据到 ElasticSearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
一个 ElasticSearch 集群可以 包含多个 索引 ,
相应的每个索引可以包含多个 类型
这些不同的类型存储着多个文档
每个文档又有 多个 属性

类似关系:

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

在这里插入图片描述

三、整合ElasticSearch测试

搭建elasticSearch环境:

docker pull elasticsearch:5.6.8
 
 

拉取镜像必须指定tag。启动elasticsearch,默认的是占用2G的堆的内存空间我们要限制一下。

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 8f46db60ddd6
 
 

接口:9200 web通信的

          9300 分布式各个节点的通信

测试启动,打开浏览器:

192.168.244.130:9200
 
 

docker查看日志

 docker logs 607bdfc4d327

 
 

集群的搭建网址:

       https://blog.csdn.net/belonghuang157405/article/details/83301937

elasticsearch的官方文档:https://www.elastic.co/cn/#

官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html


测试

利用psotman发送请求,这个post应该是put。

分析返回值:

       第一个是索引 第二个是类型 第三个是id 

       继续保存:

       

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
 
PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

检索数据:

  

删除数据:

检索是不是存在的,不存在就是404:

查询所有的员工的就是_search

       

;按照条件查找:

表达式查询:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

复杂的查询表达式:

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}

上面的还是post查询。     

全文检索:

查询about这个字段是不是有包含rock climbing。

score是相关性得分。

当作完整的单词匹配不是部分包含的:

只查出一个来。

高亮搜索:

     

创建工程

打开pom文件:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

点进去看下:

分析下ES的自动配置:

看到data堆elasticsearch的支持。

jest对elasticsearch的支持。

默认支持两种技术和elasticsearch就行交互。

/**
 * SpringBoot默认支持两种技术来和ES交互;
 * 1、Jest(默认不生效)
 * 	需要导入jest的工具包(io.searchbox.client.JestClient)
 * 2、SpringData ElasticSearch【ES版本有可能不合适】
 * 		版本适配说明:https://github.com/spring-projects/spring-data-elasticsearch
 *		如果版本不适配:2.4.6
 *			1)、升级SpringBoot版本
 *			2)、安装对应版本的ES
 *
 * 		1)、Client 节点信息clusterNodes;clusterName
 * 		2)、ElasticsearchTemplate 操作es
 *		3)、编写一个 ElasticsearchRepository 的子接口来操作ES;
 *	两种用法:https://github.com/spring-projects/spring-data-elasticsearch
 *	1)、编写一个 ElasticsearchRepository
 */

看下jest的自动配置:

要是生效的话导入包:

看下data对elasticsearch的配置:

配置客户端,指定属性。

         

看下一个配置文件:

     

crud的模板。

测试:首先我们测试下jest的这样要在pom文件注掉:

导入jest:

<dependency>
            <groupId>io.searchbox</groupId>
            <artifactId>jest</artifactId>
            <version>5.3.3</version>
</dependency>

看下jest的自动配置是否生效:

不报红了,接下来我们要配置一些属性:

     

主要是这个属性,看配置的话主要是看xxxAutoConfiguration的。

配置这个:

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

  启动:不报错

 

用这个进行交互。

测试JestClient:

               

@Autowired
JestClient jestClient;

写两个bean的类:

           

           

@Test
	public void contextLoads() {
		//1、给Es中索引(保存)一个文档;
		Article article = new Article();
		article.setId(1);
		article.setTitle("好消息");
		article.setAuthor("zhangsan");
		article.setContent("Hello World");
 
		//构建一个索引功能
		Index index = new Index.Builder(article).index("atguigu").type("news").build();
 
		try {
			//执行
			jestClient.execute(index);
		} catch (IOException e) {
			e.printStackTrace();
		}
}

    执行。查询一下。

搜索:

//测试搜索
    @Test
    public void search(){
 
        //查询表达式
        String json ="{\n" +
                "    \"query\" : {\n" +
                "        \"match\" : {\n" +
                "            \"content\" : \"hello\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
 
        //更多操作:https://github.com/searchbox-io/Jest/tree/master/jest
        //构建搜索功能
        Search search = new Search.Builder(json).addIndex("atguigu").addType("news").build();
 
        //执行
        try {
            SearchResult result = jestClient.execute(search);
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

         接下来整合SpringDataElasticsearch

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

首先是注掉的jest解绑,留下jest。

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.244.130:9300

   原理在jest模块

   接下来我们看下参数。

   

    nodes写上主机地址的9300端口。

    报错,可知ES版本可能不合适,参照官方文档。

    地址:https://spring.io/projects/spring-data-elasticsearch#learn     

 

         版本分析。

            看下版本的关系。

和springboot一样

这个是3.1.6版本。和es的5版本适配是对的。

我这个没有报错的。版本不适配升级springboot版本和安装es。

讲的降低elasticsearch的版本了。

注意按照道理说是用docker装6.4.3的版本。

如何换接口如上。

启动:

看出添加传输节点。

如何使用看官方文档:https://github.com/spring-projects/spring-data-elasticsearch

编写一个 ElasticsearchRepository,这个是在官方文档里面建议的。

package com.atguigu.elastic.repository;
 
import com.atguigu.elastic.bean.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
 
import java.util.List;
 
 
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
 
    //参照
    // https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/
   public List<Book> findByBookNameLike(String bookName);
 
}

注意继承关系就有其里面的所有的方法了。

 写一个bean:

      

测试:

@Autowired
BookRepository bookRepository;

注入bookRepository

注意一点Book类上要标注上索引和类型。

import org.springframework.data.elasticsearch.annotations.Document;
 
@Document(indexName = "atguigu",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() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

@Test
	public void test02(){
		Book book = new Book();
		book.setId(1);
		book.setBookName("西游记");
		book.setAuthor("吴承恩");
		bookRepository.index(book);
		
		//for (Book book : bookRepository.findByBookNameLike("游")) {
			//System.out.println(book);
		//}
	}

测试。

    查询下:报错,原因是虚拟机的elasticsearch的版本问题。

         

 增删改查都在整个类里面写, 注意可以自定义自己的查询方法 

package com.atguigu.elastic.repository;
 
import com.atguigu.elastic.bean.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
 
import java.util.List;
 
 
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
 
    //参照
    // https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/
   public List<Book> findByBookNameLike(String bookName);
 
}

 

	@Test
	public void test02(){
		//Book book = new Book();
		//book.setId(1);
		//book.setBookName("西游记");
		//book.setAuthor("吴承恩");
		//bookRepository.index(book);
 
		for (Book book : bookRepository.findByBookNameLike("游")) {
			System.out.println(book);
		}
	}

 查询下,注意只写方法名即可。

  参照官方文档:

           

        或者注解:

     

github地址:

https://blog.csdn.net/qq_28764557/article/details/89279051

      jest的:https://github.com/FandyWw/springboot-03-elastic-jest

      Data的:https://github.com/FandyWw/springboot-03-elastic-data

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Spring Boot Starter Data 整合 Elasticsearch,可以按照以下步骤进行: 1. 在 pom.xml 文件中添加 Elasticsearch 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 在 application.properties 文件中配置 Elasticsearch 的连接信息: ```properties spring.data.elasticsearch.cluster-nodes=localhost:9300 spring.data.elasticsearch.cluster-name=my-application ``` 其中,cluster-nodes 是 Elasticsearch 集群节点的地址,cluster-name 是集群名称。 3. 创建一个 ElasticsearchRepository 接口来定义 Elasticsearch 的操作: ```java public interface BookRepository extends ElasticsearchRepository<Book, String> { } ``` 其中,Book 是实体类,String 是实体类主键的数据类型。 4. 在需要使用 Elasticsearch 的地方注入 ElasticsearchRepository 接口,并使用它进行数据操作: ```java @Autowired private BookRepository bookRepository; public void saveBook(Book book) { bookRepository.save(book); } public List<Book> findBooksByAuthor(String author) { return bookRepository.findByAuthor(author); } ``` 这里的 save 方法是保存数据,findByAuthor 方法是按照作者查询数据。 以上就是 Spring Boot Starter Data 整合 Elasticsearch 的基本步骤。需要注意的是,这里使用的是 ElasticsearchRepository 接口,它提供了一些常用的操作方法,如果需要更多的操作,可以使用 ElasticsearchTemplate 类来进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值