Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口

这篇具有很好参考价值的文章主要介绍了Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口

本教程是本人亲自实战的,然后运行起来的全部步骤。

准备工作

环境
Elasticsearch 7.15.2
Kibana 7.15.2
springboot 2.6.4 以及对应的spring-boot-starter-web和spring-boot-starter-data-elasticsearch
fastjson 1.2.97

  1. 安装好Elasticsearch7.15.2以及对应的Kibana。
  2. 去Springboot Start 新建项目

在Kibana中新建索引book

使用 devtools 创建

# 新增索引
PUT book
{
  "settings" : {
      "number_of_shards" : 5,
      "number_of_replicas" : 0,
      "refresh_interval": "5s", 
      "index.mapping.ignore_malformed": true 
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_max_word"
      },
      "author": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_max_word"
      },
      "postDate": {
        "type": "keyword"
      }
    }
  }
}

number_of_shards 数据分片 默认为5
number_of_replicas 数据备份数,如果只有一台机器,建议设置为0,避免索引一直处于yellow状态

查看是否创建成功

HEAD book

返回如下,即为创建索引成功

200 - OK

搜素 book 里面的信息

POST book/_search
{
  "from": 0,
  "size": 20
}

新建springboot项目

Springboot Start 新建项目
Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口
点击generate就会获取一个zip的包。这个就是生成的项目哦。

打开项目

项目完成之后的完整目录:
Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口

pom.xml文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.wumeng</groupId>
	<artifactId>esapi</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>esapi</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>


		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.79</version>
		</dependency>



	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>


	<repositories>
		<repository>
			<id>ali-maven</id>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</repository>
	</repositories>

</project>

application.properties 文件

# ELASTICSEARCH (ElasticsearchProperties)

# Whether to enable Elasticsearch repositories.
spring.data.elasticsearch.repositories.enabled=true

spring.elasticsearch.uris=http://192.168.0.119:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=12345678
spring.elasticsearch.socket-timeout=30

修改成自己的用户名和密码哦

BookBean.java 文件

import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Data
@Builder
@Document(indexName = "book")
public class BookBean {
    private @Id String id;

    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String title;

    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String author;

    private String postDate;

    public  BookBean(){}

    public BookBean(String id, String title, String author, String postDate) {
        this.id = id;
        this.title = title;
        this.author = author;
        this.postDate = postDate;
    }
}

BookRepository.java 文件

import com.wumeng.esapi.model.BookBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BookRepository extends ElasticsearchRepository<BookBean,String> {

    //Optional<BookBean> findById(String id);

    Page<BookBean> findByAuthor(String author, Pageable pageable);

    Page<BookBean> findByTitle(String title, Pageable pageable);
    
    @Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}")
    Page<BookBean> findByTitle_custom(String keyword, Pageable pageable);

}

BookService.java 文件

import com.wumeng.esapi.model.BookBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

import java.util.List;
import java.util.Optional;

public interface BookService {
    Optional<BookBean> findById(String id);

    BookBean save(BookBean blog);

    void delete(BookBean blog);

    Optional<BookBean> findOne(String id);

    List<BookBean> findAll();

    Page<BookBean> findByAuthor(String author, PageRequest pageRequest);

    Page<BookBean> findByTitle(String title, PageRequest pageRequest);

    List<BookBean> searchByKeyword(String keyword, PageRequest pageRequest);

}

BookServiceImpl.java 文件

import com.wumeng.esapi.repository.BookRepository;
import com.wumeng.esapi.model.BookBean;
import com.wumeng.esapi.service.BookService;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    @Qualifier("bookRepository")
    private BookRepository bookRepository;

    @Autowired
    private ElasticsearchOperations elasticsearchOperations;


    @Override
    public Optional<BookBean> findById(String id) {
        //CrudRepository中的方法
        return bookRepository.findById(id);
    }

    @Override
    public BookBean save(BookBean blog) {
        return bookRepository.save(blog);
    }

    @Override
    public void delete(BookBean blog) {
        bookRepository.delete(blog);
    }

    @Override
    public Optional<BookBean> findOne(String id) {
        return bookRepository.findById(id);
    }

    @Override
    public List<BookBean> findAll() {
        return (List<BookBean>) bookRepository.findAll();
    }

    @Override
    public Page<BookBean> findByAuthor(String author, PageRequest pageRequest) {
        return bookRepository.findByAuthor(author,pageRequest);
    }

    @Override
    public Page<BookBean> findByTitle(String title, PageRequest pageRequest) {
        return bookRepository.findByTitle(title,pageRequest);
    }


//    @Override
//    public Page<BookBean> searchByKeyword(String keyword, PageRequest pageRequest) {
//        return bookRepository.searchByKeyword(keyword, pageRequest);
//    }

    @Override
    public List<BookBean> searchByKeyword(String keyword, PageRequest pageRequest) {



        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        // 查询必须满足的条件
//        boolQueryBuilder.must(QueryBuilders.termQuery("studentSex", "女"));

        // 查询可能满足的条件
//        boolQueryBuilder.should(QueryBuilders.termQuery("gradeNumber", "一年级"));
//        boolQueryBuilder.should(QueryBuilders.termQuery("gradeNumber", "二年级"));
//        boolQueryBuilder.should(QueryBuilders.termQuery("gradeNumber", "三年级"));//精确
        boolQueryBuilder.should(QueryBuilders.matchQuery("title",keyword));//模糊
        boolQueryBuilder.should(QueryBuilders.matchQuery("author",keyword));
        // 设置在可能满足的条件中,至少必须满足其中1条
//        boolQueryBuilder.minimumShouldMatch(1);

        // 必须不满足的条件
//        boolQueryBuilder.mustNot(QueryBuilders.termQuery("age", 8));


        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //查询
        nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
        //排序
        nativeSearchQueryBuilder.withSorts(SortBuilders.fieldSort("postDate").order(SortOrder.ASC));
        //分页
        nativeSearchQueryBuilder.withPageable(pageRequest);
		
		//搜索
        NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
        SearchHits<BookBean> productHits = this.elasticsearchOperations.search(nativeSearchQuery, BookBean.class, IndexCoordinates.of("book"));

        List<BookBean> productMatches = new ArrayList<BookBean>();
        productHits.forEach(searchHit->{
            productMatches.add(searchHit.getContent());
        });

        return productMatches;
    }
}

BookController.java 文件


import com.alibaba.fastjson.JSON;
import com.wumeng.esapi.service.BookService;
import com.wumeng.esapi.model.BookBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("book")
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping("/id/{id}")
    @ResponseBody
    public BookBean getBookById(@PathVariable String id){
        Optional<BookBean> opt =bookService.findById(id);
        BookBean book=opt.get();
        System.out.println(book);
        return book;
    }

    @RequestMapping("/save")
    @ResponseBody
    public String Save(){
        BookBean book=new BookBean("1","ES入门教程","你刚回来了","2022-03-09");
        System.out.println(book);
        bookService.save(book);

        book=new BookBean("2","ES入门教程","你刚回来了","2022-03-09");
        System.out.println(book);
        bookService.save(book);

        book=new BookBean("3","ES入门教程","你刚回来了","2022-03-09");
        System.out.println(book);
        bookService.save(book);

        return "Save success.";

    }
    @RequestMapping("/search/{keyword}")
    @ResponseBody
    public String searchBookByKeyWord(@PathVariable String keyword){
        List<BookBean> list = bookService.searchByKeyword(keyword,PageRequest.of(0,200));
        System.out.println(list);
        return JSON.toJSONString(list);
    }

}

运行项目,跑起来。

插入信息

访问地址:http://127.0.0.1:8080/book/save

Save success.
根据id查询信息

访问地址:http://127.0.0.1:8080/book/id/1

{"id":"1","title":"ES入门教程","author":"你刚回来了","postDate":"2022-03-09"}
模糊查询titie 和author

访问地址:http://127.0.0.1:8080/book/search/ES

[{"author":"你刚回来了","id":"2","postDate":"2022-03-09","title":"ES入门教程"},{"author":"你刚回来了","id":"1","postDate":"2022-03-09","title":"ES入门教程"}]

此次,项目简单基本雏形已经有了,可以继续开发其他任务了。文章来源地址https://www.toymoban.com/news/detail-403105.html

到了这里,关于Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot进阶教程(七十九)spring-boot-starter- 有哪些 starter类型

    spring Boot应用启动器基本的一共有44种,具体如下 参考文献:https://www.javatpoint.com/spring-boot-starters

    2024年02月05日
    浏览(51)
  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

    springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 Jasypt默认算法为PBEWithMD5AndDES,该算法需要一个加密密钥,可以在应用启动时指定(环境变量)。也可以直接写入配置文件 3.1 application.properties配置文件版 加密后,可删除jasypt.encryptor.password配置;发版时可在命令行中配置 3.2 函数

    2024年02月15日
    浏览(39)
  • springboot web创建失败,解决Could not find artifact org.springframework.boot:spring-boot-starter-parent:pom

    jdk8不支持3.0以上的springboot版本,如果你在创建项目的时候用的是jdk8,那么我建议你在创建好项目之后自行再pom文件里降级,我刚开始接触springboot时,用的是jdk11,导入的springboot版本是2.7.1,然后弄了差不多半天都找不到原因,然后我就扩大了阿里云的搜索地址,自行在pom文

    2024年02月04日
    浏览(44)
  • springboot 发送邮件,以及邮件工具类 并且解决spring-boot-starter-mail 发送邮件附件乱码或者文件错乱

    1、设置系统值 System.setProperty(“mail.mime.splitlongparameters”, “false”); 2、 在创建对象的时候定义编码格式(utf-8): MimeMessageHelper helper = new MimeMessageHelper(mes, true, “utf-8”); 3、 其次,在添加附件的时候,附件名是需要定义编码的 helper.addAttachment(MimeUtility.encodeWord(附件名,“utf-8”

    2024年02月15日
    浏览(63)
  • Spring Boot - spring-boot-starter

    spring-boot-starter 当学习Spring Boot时,可以通过一个完整的案例来理解和实践其基本概念和功能。以下是一个简单的Spring Boot Starter完整案例,展示了如何创建一个基本的Web应用程序: 首先,创建一个名为pom.xml的Maven项目文件,添加以下内容:idea或其他直接创建直接跳过!

    2024年02月09日
    浏览(47)
  • Spring Boot Starters

    Spring Boot Starters 概述 Spring Boot Starters是一系列为特定应用场景预设的依赖管理和自动配置方案。每个Starter都是为了简化特定类型的项目构建和配置。例如, spring-boot-starter-web 是为创建基于Spring MVC的Web应用程序而设计的。 Starter的结构 一个典型的Starter包含以下部分: pom.xml

    2024年01月25日
    浏览(38)
  • Spring Boot Starter设计实现

    Starter 是 Spring Boot 非常重要的一个硬核功能。 通过 Starter 我们可以快速的引入一个功能或模块,而无须关心模块依赖的其它组件。关于配置,Spring Boot 采用“约定大于配置”的设计理念,Starter 一般都会提供默认配置,只有当我们有特殊需求的时候,才需要在 application.yaml 里

    2024年01月18日
    浏览(47)
  • 6. Spring Boot的starters

    6. Spring Boot的starters(重要) 一般认为,SpringBoot 微框架从两个主要层面影响 Spring 社区的开发者们: 基于 Spring 框架的“约定优先于配置(COC)”理念以及最佳实践之路。 提供了针对日常企业应用研发各种场景的 spring-boot-starter 自动配置依赖模块,如此多“开箱即用”的依赖模

    2024年01月24日
    浏览(43)
  • Spring Boot Starter Parent

    在这,您将学习了解 Spring Boot Starter Parent, 它是 Spring Boot 提供的父级 Pom 文件,旨在提供自动版本依赖管理,帮助我们轻松快速地进行 Spring Boot 开发。 通过 Spring Boot Starter Parent, 我们可以进行简单便捷地包依赖管理。在 Spring Boot 每一个发行版中, 均提供了该版本所兼容的依

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包