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日
    浏览(36)
  • 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日
    浏览(35)
  • 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日
    浏览(38)
  • 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日
    浏览(53)
  • Spring Boot - spring-boot-starter

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

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

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

    2024年01月25日
    浏览(32)
  • Spring Boot Starter Parent

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

    2024年02月08日
    浏览(32)
  • 自定义Spring Boot Starter

    Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的。在实际项目中一些基础模块其本质就是starter,所以我们需要对Spring Boot的starter有一个全面深入的了解,这是我们的必备知识。 starter介绍 spring boot 在配置

    2024年02月10日
    浏览(76)
  • Spring Boot Starter设计实现

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

    2024年01月18日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包