springboot整合es进行搜索(一)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: springboot整合es进行搜索

1.Elasticsearch 安装

1.1 下载软件

Elasticsearch 分为 Linux 和 Windows 版本,这里我们只是做测试,因此下载 windows 版本即可。

1.2 安装软件

Windows 版的 Elasticsearch 的安装很简单,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下:

目录 含义
bin 可执行脚本目录
config 配置目录
jdk 内置JDK目录
lib 类库
logs 日志目录
modules 模块目录
plugins 插件目录

1.3 安装 ik 中文分词器

🏠 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0

  • ik_max_word:会将文本做最细粒度的拆分
  • ik_smart:会将文本做最粗粒度的拆分

将解压后的后的文件夹放入 ES 根目录下的 plugins 目录下。

1.4 启动ES

解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务:

⚠️ 注意:

  • 9300 端口为 Elasticsearch 集群间组件的通信端口。
  • 9200 端口为浏览器访问的 http 协议 RESTful 端口。

💻 浏览器访问地址:http://localhost:9200

1.5 问题解决

  • Elasticsearch 是使用 java 开发的,且 7.8 版本的 ES 需要 JDK 版本 1.8 以上,默认安装包带有 jdk 环境,如果系统配置 JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK。
  • 双击启动窗口闪退,通过路径访问追踪错误,如果是“空间不足”,请修改 config/jvm.options 配置文件
# 设置 JVM 初始内存为 1G。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存
# Xms represents the initial size of total heap space
# 设置 JVM 最大可用内存为 1G
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g

2.Kibana 安装 & 使用

Elasticsearch 的开源分析可视化工具,与存储在 Elasticsearch 中的数据进行交互。

2.1 下载软件

Elasticsearch 下载的版本是 7.8.0,这里我们选择同样的 7.8.0 版本

下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana

2.2 安装软件

解压即安装完毕,解压后的 Kibana 的目录结构如下:

修改配置文件:kibana.yml

添加如下信息:

# 服务端口
server.port: 5601
# 国际化 - 中文
i18n.locale: "zh-CN"
# ES 服务主机地址
elasticsearch.hosts: ["http://localhost:9200"]
server.ssl.enabled: false

2.3 启动 Kibana

访问浏览器:http://localhost:5601/

3.实战开发-前提准备

3.1 开发背景

假设有一个博客模块,即有一个博客圈,用户可以通过搜索来获取与自己输入的关键字相关的数据列表,类似于CSDN的搜索。

由于只是 demo,因此这里会设计的很简单。

  • 不支持通过作者进行搜索。

3.2 数据库表设计

# 如果存在 es_demo 数据库则删除
DROP DATABASE IF EXISTS `es_demo`;
# 创建新数据库
CREATE DATABASE `es_demo`;
# 创建一张博客表
CREATE TABLE `blog`(
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` BIGINT NOT NULL COMMENT '用户id(雪花算法生成)',
  `title` VARCHAR(255) NOT NULL COMMENT '标题',
  `tags` VARCHAR(64) NOT NULL COMMENT '标签',
  `introduce` VARCHAR(512) NOT NULL COMMENT '介绍',
  `content` TEXT NOT NULL COMMENT '文章内容', 
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY(`id`),
  KEY `idx_user_create`(`user_id`,`create_time` DESC)
)ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客信息表';

3.3 创建es索引与映射

PUT /blog
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "userId": {
        "type": "long"
      },
      "title": {
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "type": "text"
      },
      "tags": {
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "type": "text"
      },
      "introduce":{
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "type": "text"
      },
      "content":{
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "type": "text"
      },
      "createTime":{
        "format": "yyyy-MM-dd HH:mm:ss",
        "type": "date"
      },
      "updateTime":{
        "format": "yyyy-MM-dd HH:mm:ss",
        "type": "date"
      }
    }
  }
}

3.4 es文档数据

其实按照正常的逻辑,应当在往数据库表添加记录后也写入到es中,可以使用java代码实现。但这里为了简单起见,我们直接往es中添加数据进行测试。

POST /blog/_doc/1000
{
  "id":1000,
  "userId":1626989073847750657,
  "title":"Java语言",
  "introduce":"Java的起源",
  "content":"Java最初是由任职于太阳微系统的詹姆斯-高斯林(James-Gosling)等人于1990年代初开发。最初被命名为Oak;当时发现Oak被其他公司注册了,不得不重新起名,当时他们正在咖啡馆喝着印尼爪哇(JAVA)岛出产的咖啡,有人提议就叫JAVA怎么样,然后就这样定下来了。",
  "tags":"编程,java,语言",
  "createTime":"2023-03-23 00:40:20",
  "updateTIme":"2023-03-23 00:40:20"
}
POST /blog/_doc/1001
{
  "id":1001,
  "userId":1626989073847750657,
  "title":"C语言",
  "introduce":"C的起源",
  "content":"C语言是由美国贝尔实验室的Dennis Ritchie于1972年设计发明的,最初在UNIX操作系统的DEC PDP-11计算机上使用。它由早期的编程语言BCPL(Basic Combind Programming Language)发展演变而来。",
  "tags":"编程,C,语言",
  "createTime":"2023-03-23 00:40:20",
  "updateTIme":"2023-03-23 00:40:20"
}
POST /blog/_doc/1002
{
  "id":1002,
  "userId":1626989073847750657,
  "title":"C与JAVA语言",
  "introduce":"c和java关系",
  "content":"C语言和Java都是计算机编程语言,但它们有很多不同之处。C语言是一种面向过程的编程语言,而Java是一种面向对象的编程语言。",
  "tags":"C,java,语言",
  "createTime":"2023-03-23 00:40:20",
  "updateTIme":"2023-03-23 00:40:20"
}

4.实战开发-后端代码

4.1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.fox</groupId>
    <artifactId>elasticsearch-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.0</version>
        </dependency>
        <!--fastjson依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.33</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.7</version>
        </dependency>
    </dependencies>
</project>

4.2 application.yml配置

server:
  # 服务端口
  port: 9999
elasticsearch:
  # es访问ip
  hostname: 127.0.0.1
  # es访问port
  port: 9200
  blog:
    # 访问索引
    index: blog
    # 搜索返回字段
    source_fields: id,userId,title,introduce,createTime


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
|
Java 数据安全/隐私保护 Spring
百度搜索:蓝易云【SpringBoot—jasypt加解密库的使用方法。】
希望以上内容对你理解和使用Spring Boot中的Jasypt加解密库有所帮助。如果需要更详细的信息和示例,请参考Jasypt库的官方文档和示例代码。
84 0
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
221 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的文献搜索系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的文献搜索系统附带文章源码部署视频讲解等
45 0
|
5月前
|
人工智能 Java
AI大模型----SpringBoot添加放行最简单的方式@AuthAccess,问题库构思,概念title,答案text,搜索search
AI大模型----SpringBoot添加放行最简单的方式@AuthAccess,问题库构思,概念title,答案text,搜索search
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的文献搜索系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的文献搜索系统的详细设计和实现(源码+lw+部署文档+讲解等)
65 0
|
7月前
|
XML 存储 Java
百度搜索:蓝易云【springboot增加logback日志记录ip详解】
通过以上步骤,您可以在Spring Boot应用程序中使用Logback记录客户端的IP地址。请根据实际需求和日志记录规则进行适当调整和配置。
111 0
|
canal 存储 关系型数据库
Spring Boot业务系统如何实现海量数据高效实时搜索
我们都知道随着业务系统的发展和使用,数据库存储的业务数据量会越来越大,逐渐成为了业务系统的瓶颈。在阿里巴巴开发手册中也建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时就分库分表。数据库最终都是存储在磁盘上,随着数据量变大,会导致数据操作变得缓慢,无论是计算还是IO,但是话又说回来,单表数据量大就一定要进行分库分表操作吗?答案是否定的,因为分库分表本身是一个“很重”的操作,这里就不卖关子了,直接来看看分库分表带来的以下问题和挑战
496 1
Spring Boot业务系统如何实现海量数据高效实时搜索
|
前端开发 Java Spring
百度搜索:蓝易云【SpringBoot解决跨域的方法详细教程。】
通过以上步骤,你可以在Spring Boot中配置跨域支持。根据实际需求,可以灵活调整跨域规则来满足项目的具体需求。
55 0
|
前端开发 Java 数据库连接
基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能
基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能
65 0
|
自然语言处理 数据可视化 数据库
Elasticsearch 搜索测试与集成Springboot3
它能够一定程度上解决,在一个普通数据库处理上亿条数据时的查询效率低下的同时无法优秀地排列好用户所需要的数据,一次性上亿条数据没有经过正确地排列,用户很难找到想要的数据。并且,用户输入的数据可能不太准确,它也能够进行模糊查询,这种模糊查询是依靠计算得来的,而不是简单地匹配数据。本系列博文将从零开始一步步实现将 ES 集成到 springboot3 中,并在一个社区项目中进行实际应用测试,本文为系列第一篇,后续,博文仍在整理,请持续关注博主,了解更多相关知识。
166 0
Elasticsearch 搜索测试与集成Springboot3