广告
返回顶部
首页 > 资讯 > 精选 >怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎
  • 607
分享到

怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

springbootelasticsearch 2023-05-30 22:05:44 607人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关怎么在Spring Boot中使用elasticsearch实现一个搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Elastic Search是一个开源的

这篇文章将为大家详细讲解有关怎么在Spring Boot中使用elasticsearch实现一个搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Elastic Search是一个开源的,分布式,实时搜索和分析引擎。spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置。Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'。

ElasticSearch作为搜索引擎,我们需要解决2大问题:

1,  如何将被搜索的数据在ES上创建反向索引
2,  Java代码如何与ES交互

其中第一个大问题又分为两个小问题

1,如何初始化已有的数据
1.2,如何同步增量数据

第二个大问题也有两种集成方式

1 Spring Data 9300端口集成
2.2 Restful api 9200端口集成

本篇先解决第二大问题。

第一种方式,利用RestAPI方式,也叫Jest方式:

示例代码:https://GitHub.com/yejingtao/forblog/tree/master/demo-jest-elasticsearch

Pom.xml:

<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>yejingtao.demo.SpringCloud</groupId>  <artifactId>demo-jest-elasticsearch</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>   <name>demo-jest-elasticsearch</name>  <url>http://maven.apache.org</url>   <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>    <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>1.5.6.RELEASE</version>   </parent>      <dependencies>     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-WEB</artifactId>     </dependency>     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-data-elasticsearch</artifactId>     </dependency>     <dependency>       <groupId>io.searchbox</groupId>       <artifactId>jest</artifactId>     </dependency>     <dependency>       <groupId>net.java.dev.jna</groupId>       <artifactId>jna</artifactId>     </dependency>   </dependencies> </project>

Application.yml:

server:  port: 7081  spring:  elasticsearch:   jest:    uris:    - http://192.168.226.133:9200    read-timeout: 5000

注意这里是9200端口

主程序:最简单的Spring boot启动程序:

@SpringBootApplication public class ESApplication {    public static void main(String[] args) {     SpringApplication.run(ESApplication.class);   } }

定义好ES中的实体类和对ES操作的接口:

public class Entity implements Serializable{    private static final long serialVersionUID = -763638353551774166L;      public static final String INDEX_NAME = "index_entity";      public static final String TYPE = "tstype";    private Long id;      private String name;      public Entity() {     super();   }      public Entity(Long id, String name) {     this.id = id;     this.name = name;   }    public Long getId() {     return id;   }    public void setId(Long id) {     this.id = id;   }    public String getName() {     return name;   }    public void setName(String name) {     this.name = name;   }       }
public interface CityESService {      void saveEntity(Entity entity);      void saveEntity(List<Entity> entityList);      List<Entity> searchEntity(String searchContent); }

接口实现:

@Service public class CityESServiceImpl implements CityESService{      private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);      @Autowired   private JestClient jestClient;      @Override   public void saveEntity(Entity entity) {     Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build();     try {       jestClient.execute(index);       LOGGER.info("ES 插入完成");     } catch (IOException e) {       e.printStackTrace();       LOGGER.error(e.getMessage());     }   }            @Override   public void saveEntity(List<Entity> entityList) {     Bulk.Builder bulk = new Bulk.Builder();     for(Entity entity : entityList) {       Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build();       bulk.addAction(index);     }         try {       jestClient.execute(bulk.build());       LOGGER.info("ES 插入完成");     } catch (IOException e) {       e.printStackTrace();       LOGGER.error(e.getMessage());     }   }         @Override   public List<Entity> searchEntity(String searchContent){     SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();     //searchSourceBuilder.query(QueryBuilders.queryStringQuery(searchContent));     //searchSourceBuilder.field("name");     searchSourceBuilder.query(QueryBuilders.matchQuery("name",searchContent));     Search search = new Search.Builder(searchSourceBuilder.toString())         .addIndex(Entity.INDEX_NAME).addType(Entity.TYPE).build();     try {       JestResult result = jestClient.execute(search);       return result.getSourceAsObjectList(Entity.class);     } catch (IOException e) {       LOGGER.error(e.getMessage());       e.printStackTrace();     }     return null;       } }

这里插入数据的方式给了两种,一种是单次API直接插入,一种是利用ES的bulk批量插入。

做一个controller方面我们测试

启动后在浏览器中请求http://localhost:7081/entityController/search?name=%E4%BA%BA%E6%89%8B%E4%BA%95

得到结果:

怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

这里只返回了9条记录,而理论上ES默认的size是10,应该不是分页的问题,而是只能检索出9条匹配记录,用Kibana连上相同的搜索确认下:

怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

这里用的是standard分词方式,将每个中文都作为了一个term,凡是包含“人”“手”“井”的都被搜索了出来,只是评分不同,如果想支持只能中文索引需要依赖ik插件

OK,RestFul方式对ElasticSearch的检索已经搞定了,更多的扩展可以慢慢研究下QueryBuilders里的源码和批注。

第二种方式,利用Spring Data客户端方式:

事先说明此方式有个弊端,让我掉了坑里好久才爬上来,Spring Data ElasticSearch必须与ElasticSearch版本相匹配,否则在对接时ES端会报版本不匹配错误,例如我ES是5.6.1版本,Spring boot是1.5.6版本,错误如下:

为解决这个问题我查找了一些资料,Spring Data与elasticsearch版本对应关系如下:

spring data elasticsearch

elasticsearch

0.0.RC2

5.0

0.0.M4

4.0

0.4.RELEASE

0

0.0.RELEASE

2.0

0.M1

3

0.RELEASE

2

0.RELEASE

4

1.0.RELEASE

2

0.0.RELEASE

1.1

而我用的Spring Boot 1.5.6版本对应的Spring Data ElasticSearch是2.1.6版本,不支持5.X的ES,所以报错。到本博文撰写为止,Spring Boot的RELEASE版本最新的是1.5.8,对应的Spring Data ElasticSearch是2.1.8,仍不支持5.X的ES,所以如果一定要使用Java客户端方式集成ES只能放弃Spring Boot直接使用Spring Data和Spring mvc,或者降低ES的版本使之与Spring boot匹配。

示例代码:https://github.com/yejingtao/forblog/tree/master/demo-data-elasticsearch

pom.xml依赖:

<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>yejingtao.demo.sprinGCloud</groupId>  <artifactId>demo-data-elasticsearch</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>   <name>demo-data-elasticsearch</name>  <url>http://maven.apache.org</url>   <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>    <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>1.5.8.RELEASE</version>   </parent>      <dependencies>     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-web</artifactId>     </dependency>     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-data-elasticsearch</artifactId>     </dependency>   </dependencies> </project>

不再引用Jest。

application.yml:

server:  port: 7081  spring:  data:   elasticsearch:    cluster-nodes: 192.168.226.133:9300    cluster-name: my-es    repositories:     enabled: true

注意这里是9300端口

Controller、主程序、Service接口同Jest项目不变,不再罗列

实体类稍作变化,指定ES中的index和type:

@Document(indexName="index_entity", type="tstype")

多一个Repository接口,无需实现类,spring data标准用法:

 public interface EntityRepository extends ElasticsearchRepository<Entity,Long>{  }

Service实现类与Jest的天壤之别了,从语法上可以看出更像是对数据库层的操作:

@Service public class CityESServiceImpl implements CityESService{      private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);      int PAGE_SIZE = 15; //默认分页大小      int PAGE_NUMBER = 0; //默认当前分页      String SCORE_MODE_SUM = "sum"; //权重分求和模式      Float MIN_SCORE = 10.0F; //由于无相关性的分值默认为1, 设置权重分最小值为10      @Autowired   EntityRepository entityRepository;         @Override   public Long saveEntity(Entity entity) {     Entity entityResult = entityRepository.save(entity);     return entityResult.getId();   }         @Override   public List<Entity> searchEntity(int pageNumber, int pageSize, String searchContent){     if(pageSize==0) {       pageSize = PAGE_SIZE;     }     if(pageNumber<0) {       pageNumber = PAGE_NUMBER;     }          SearchQuery searchQuery = getEntitySearchQuery(pageNumber,pageSize,searchContent);          LOGGER.info("\n searchCity: searchContent [" + searchContent + "] \n DSL = \n "          + searchQuery.getQuery().toString());           Page<Entity> cityPage = entityRepository.search(searchQuery);     return cityPage.getContent();   }         private SearchQuery getEntitySearchQuery(int pageNumber, int pageSize, String searchContent) {     FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()         .add(QueryBuilders.matchPhraseQuery("name", searchContent),             ScoreFunctionBuilders.weightFactorFunction(1000))         //.add(QueryBuilders.matchPhraseQuery("other", searchContent),             //ScoreFunctionBuilders.weightFactorFunction(1000))         .scoreMode(SCORE_MODE_SUM).setMinScore(MIN_SCORE);     //设置分页,否则只能按照ES默认的分页给     Pageable pageable = new PageRequest(pageNumber, pageSize);     return new NativeSearchQueryBuilder().withPageable(pageable).withQuery(functionScoreQueryBuilder).build();   }    }

关于怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

本文链接: https://www.lsjlt.com/news/221891.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎
    这篇文章将为大家详细讲解有关怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Elastic Search是一个开源的...
    99+
    2023-05-30
    springboot elasticsearch
  • MySQL中怎么实现一个搜索引擎
    本篇文章为大家展示了MySQL中怎么实现一个搜索引擎,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言 只有Innodb和myisam存储引擎能用全文索引...
    99+
    2022-10-18
  • PHP 中使用 Elasticsearch 实现分布式搜索引擎
    简介:分布式搜索引擎是现代互联网应用中非常重要的一环,它能够实现快速的全文检索、高效的数据搜索和排序。Elasticsearch是一个基于Lucene的开源分布式搜索引擎,提供了强大的搜索和分析功能。本文将介绍如何在PHP中使用Elasti...
    99+
    2023-10-21
    PHP elasticsearch 分布式搜索引擎
  • PHP中怎么实现一个站内搜索引擎
    这篇文章将为大家详细讲解有关PHP中怎么实现一个站内搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP实现站内搜索引擎的具体代码:<   inc...
    99+
    2023-06-17
  • SpringBoot2中怎么整合ElasticSearch框架实现高性能搜索引擎
    SpringBoot2中怎么整合ElasticSearch框架实现高性能搜索引擎,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、核心依赖<dependency>...
    99+
    2023-06-02
  • 在Kotlin中使用Spring Boot怎么实现一个RESTful服务
    今天就跟大家聊聊有关在Kotlin中使用Spring Boot怎么实现一个RESTful服务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring太复杂了,配置这个东西简直就是浪...
    99+
    2023-05-31
    kotlin spring boot restful
  • 如何使用MySQL和Java实现一个简单的搜索引擎功能
    要使用MySQL和Java实现一个简单的搜索引擎功能,可以按照以下步骤进行:1. 创建数据库:首先,使用MySQL Workbenc...
    99+
    2023-10-20
    MySQL
  • 怎么在Android Studio中实现一个搜索栏
    这篇文章将为大家详细讲解有关怎么在Android Studio中实现一个搜索栏,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.引入布局如果在每一个Activity的布局中都编写一个搜索栏,...
    99+
    2023-06-14
  • 怎么在Spring Boot与Thymeleaf中使用JPA实现一个分页效果
    怎么在Spring Boot与Thymeleaf中使用JPA实现一个分页效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 创建项目,用pom.xml引入依赖这里将创建名为T...
    99+
    2023-06-06
  • 怎么在mysql中实现一个联合索引
    这篇文章将为大家详细讲解有关怎么在mysql中实现一个联合索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。联合索引联合索引的定义为(MySQL):ALTER TABLE ...
    99+
    2023-06-14
  • 使用JavaScript怎么实现一个二叉搜索树
    今天就跟大家聊聊有关使用JavaScript怎么实现一个二叉搜索树,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点...
    99+
    2023-06-07
  • 如何在spring boot中使用spring-kafka实现一个接收消息功能
    本篇文章为大家展示了如何在spring boot中使用spring-kafka实现一个接收消息功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现方法pom.xml文件如下<&#63...
    99+
    2023-05-31
    springboot spring-kafka
  • 使用Ajax怎么实现一个搜索分页功能
    使用Ajax怎么实现一个搜索分页功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通...
    99+
    2023-06-08
  • 使用Html5怎么实现一个语音搜索功能
    这篇文章给大家介绍使用Html5怎么实现一个语音搜索功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可以将网络上的文档格式...
    99+
    2023-06-09
  • 如何在Spring Boot中使用 Actuator实现一个监控端点功能
    这篇文章将为大家详细讲解有关如何在Spring Boot中使用 Actuator实现一个监控端点功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Spring Boot的众多Starter...
    99+
    2023-05-31
    springboot actuator
  • 使用Spring Boot怎么样实现一个验证码生成功能
    这篇文章给大家介绍使用Spring Boot怎么样实现一个验证码生成功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、验证码生成类import java.awt.*;import java.awt.image.Bu...
    99+
    2023-05-31
    springboot spring boo
  • 怎么在Android中利用ItemDecoration 实现一个分组索引列表
    怎么在Android中利用ItemDecoration 实现一个分组索引列表?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分组 GroupHeader分割线SideBar前两个...
    99+
    2023-05-30
    android itemdecoration
  • 使用Python怎么实现一个索引排序功能
    使用Python怎么实现一个索引排序功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。import requestsimport redef Ne...
    99+
    2023-06-14
  • Android应用中怎么实现一个搜索记录保存功能
    今天就跟大家聊聊有关Android应用中怎么实现一个搜索记录保存功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。要点:就是缓存输入的内容到 本地 下面就是实现保存 搜索内容到本地 ...
    99+
    2023-05-31
    android roi
  • 怎么用vbscript实现在文本文件中搜索两个项
    这篇文章主要介绍了怎么用vbscript实现在文本文件中搜索两个项,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:Const ForReading ...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作