Elasticsearch 搜索测试与集成Springboot3

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
无影云电脑个人版,1个月黄金款+200核时
简介: 它能够一定程度上解决,在一个普通数据库处理上亿条数据时的查询效率低下的同时无法优秀地排列好用户所需要的数据,一次性上亿条数据没有经过正确地排列,用户很难找到想要的数据。并且,用户输入的数据可能不太准确,它也能够进行模糊查询,这种模糊查询是依靠计算得来的,而不是简单地匹配数据。本系列博文将从零开始一步步实现将 ES 集成到 springboot3 中,并在一个社区项目中进行实际应用测试,本文为系列第一篇,后续,博文仍在整理,请持续关注博主,了解更多相关知识。

Elasticsearch是专门做搜索的,它非常擅长以下方面的问题

  • Elasticsearch对模糊搜索非常擅长(搜索速度很快)
  • 从Elasticsearch搜索到的数据可以根据评分过滤掉大部分的,只要返回评分高的给用户就好了(原生就支持排序)
  • 没有那么准确的关键字也能搜出相关的结果(能匹配有相关性的记录)

它能够一定程度上解决,在一个普通数据库处理上亿条数据时的查询效率低下的同时无法优秀地排列好用户所需要的数据,一次性上亿条数据没有经过正确地排列,用户很难找到想要的数据。并且,用户输入的数据可能不太准确,它也能够进行模糊查询,这种模糊查询是依靠计算得来的,而不是简单地匹配数据。本系列博文将从零开始一步步实现将 ES 集成到 springboot3 中,并在一个社区项目中进行实际应用测试,本文为系列第一篇,后续,博文仍在整理,请持续关注博主,了解更多相关知识。

@[toc]
本文将在以下环境进行测试:

  • window11
  • SpringBoot:3.0.2
  • Elasticsearch:8.5.0
  • elasticsearch-analysis-ik:8.5.0
  • Kibana:8.5.0

搭建 Elasticsearch 服务器以及分词扩展

先从 Elasticsearch 官网下载:Elasticsearch 8.5.0 | Elastic 该版本,再去 Github 下载分词器扩展:Release v8.5.0 · medcl/elasticsearch-analysis-ik (github.com) 下载完成之后,分别进行解压缩,注意后者(ik)必须解压缩在前者(Elasticsearch)解压后的 plugins 中的 ik 目录下,如下:

image-20230325160959579

进入 config 目录下,我们可以看到几个配置文件:

  • extra_main.dic:中文分词词典,词语,例如:皇帝
  • extra_stopword.dic:中文停止词词典,结束词:也、了
  • IKAnalyzer.cfg.xml:配置额外词典文件

如果需要自定义词典,在 config 目录下自定义一个英文名称的以 dic 结尾的文件,里面填入自定义词,一行一个,之后从 IKAnalyzer.cfg.xml 配置自定义词典即可生效。配置方法就是在指定位置填入对应词库名称加后缀,远程需要添加 url,并以 dic 结尾,获取到的也必须是一行一个分词。该 url 也需要返回两个头部(header),一个是Last-Modified,一个是ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。远程更新不需要重启服务器,本地词库文件更新需要重启服务器。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict"></entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

完成这些之后,我们就来配置一下 Elasticsearch 的环境变量以及本地服务器名称、数据、日志的保存路径。在系统变量处添加你解压缩的 Elasticsearch 对应的 bin 目录。在 elasticsearch-8.5.0 下找到 config 中的 elasticsearch.yml 文件,这就是配置文件,需要更改的就以下三个位置:17行、33行、37行,注意把这三行前面的 “#” 去掉。

cluster.name: yumuing
path.data: C:\tool\elasticsearch-8.5.0\data
path.logs: C:\tool\elasticsearch-8.5.0\data\logs

配置完这些之后,就可以在其 bin 目录下,找到 elasticsearch.bat 文件,双击启动即可,等待出现如下即为启动成功,第一次启动较慢,耐心等待:

注意不要使用管理员权限启动,会启动卡住,一直不动。

image-20230325163751384

如果还是卡住不动,可以尝试在 config 目录下找到 elasticsearch.yml 增加以下代码,关闭geoip数据库的更新。

ingest.geoip.downloader.enabled: false

如果,自身内存少于 16 g ,建议将 config 目录下的 jvm.options 申请内容配置修改为如下,注意删除最前面的 “##”,将初始内存改为 256m,最大内存修改为 512m。

-Xms512m
-Xmx1g

使用第一次运行 Elasticsearch 时 会自动进行安全配置,会在控制台输出账号密码,如下:

->  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  RGiwCn4abvxC4CYHNqvU

默认账号为:elastic

如果你忘记了账户密码,可以到你上面设置的 logs 目录寻找关键词:password,如果实在找不到的话,可以在 bin 目录下调取 cmd 命令行,输入:elasticsearch-reset-password -u elastic ,稍等一会就会输出密码。如果还不能输出密码,可以尝试在 elasticsearch.yml 输入以下代码

discovery.type: single-node

设置为单节点应用,在尝试输入:elasticsearch-reset-password -u elastic 修改密码。

默认端口号为 9200 ,打开 cmd 命令窗口,输入

curl -u <用户名>:<密码> -X GET "localhost:9200/_cat/health"

检查服务状态,为 green 即可开始尝试使用了。返回的 json 如下:

{
   
    "cluster_name":"yumuing",
    "status":"green",
    "timed_out":false,
    "number_of_nodes":1,
    "number_of_data_nodes":1,
    "active_primary_shards":1,
    "active_shards":1,
    "relocating_shards":0,
    "initializing_shards":0,
    "unassigned_shards":0,
    "delayed_unassigned_shards":0,
    "number_of_pending_tasks":0,
    "number_of_in_flight_fetch":0,
    "task_max_waiting_in_queue_millis":0,
    "active_shards_percent_as_number":100
}

当然,在控制台中没有进行格式美化,是一长串,注意一下。

如果不想要安全认证的话,可以添加以下代码到 elasticsearch.yml 中

xpack.security.enabled: false

输入:

curl -X GET "localhost:9200/_cat/health"

即可得到健康状态。

常见 http 命令

索引在 MySql 中代表数据库,文档代表一行数据,字段代表一列数据。

添加索引:put 请求

localhost:9200/test

查询索引:get 请求

localhost:9200/_cat/indices

删除索引:delete 请求

localhost:9200/test

插入文档:put 请求,也可作为更新数据,如有相同值文档,会先删除再增加,变相地更新

localhost:9200/test/_doc/{id}

并提交对应的 json 数据,如下:

image-20230325205050722

获得回复:本次请求中 id 值设为 1,类型在版本8.5.0已被舍弃,故没有 _type 字段。但 _doc 还是得保留在请求中。"result": "created",

{
   
    "_index": "test",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
   
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

更新文档的回复:"result": "updated",

{
   
    "_index": "test",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
   
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

查询文档:get请求, _source 即为文档数据

localhost:9200/test/_doc/{id}
{
   
    "_index": "test",
    "_id": "1",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
   
        "name": "yumuing",
        "content": "hello"
    }
}

或者查询不到数据: "found": false

{
   
    "_index": "test",
    "_id": "1",
    "found": false
}

删除文档:delete 请求

localhost:9200/test/_doc/{id}

返回数据:"result": "deleted"

{
   
    "_index": "test",
    "_id": "1",
    "_version": 2,
    "result": "deleted",
    "_shards": {
   
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

搜索所有数据:get请求 "hits": 为所有数据, "value": 3:搜索到多少条数据

localhost:9200/{索引}/_search

回复:

{
   
    "took": 809,
    "timed_out": false,
    "_shards": {
   
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
   
        "total": {
   
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
   
                "_index": "test",
                "_id": "1",
                "_score": 1.0,
                "_source": {
   
                    "title": "test",
                    "content": "测试一下"
                }
            },
            {
   
                "_index": "test",
                "_id": "3",
                "_score": 1.0,
                "_source": {
   
                    "title": "test",
                    "content": "测试2"
                }
            },
            {
   
                "_index": "test",
                "_id": "2",
                "_score": 1.0,
                "_source": {
   
                    "title": "test",
                    "content": "测试3"
                }
            }
        ]
    }
}

搜索单一特定内容:get 请求,内容无需双引号,搜索时,会自动提取内容中的词组再分别搜索包含对应词组的文档,多少个词组就有多少个搜索条件。就像运营实习,会被分为三个词组去搜索,一个是运营实习,一个是运营,一个是实习。

localhost:9200/{索引}/_search?q=字段名:内容

返回数据与搜索全部数据类似,就不展示了。

搜索多个字段内容:get 请求,携带 json

"query":"搜索关键词"
"fields":["字段1","字段2"]

{
   
    "query":{
   
        "multi_match":{
   
            "query":"2",
            "fields":["title","content"]
        }
    }
}

返回数据与其他搜索数据类似不展示。

当然,es 的搜索语法并不只有这些,还有很多,建议查看官方文档,本文仅对 es 做简单介绍,下文将介绍如何集成进 springboot中,并进行实际应用。

求关注点赞

图形化界面

一、Kibana是什么

Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。
使用前我们肯定需要先有Elasticsearch啦,安装使用Elasticsearch可以参考Elasticsearch构建全文搜索系统

下面分别演示一下Kibana的安装、自定义索引,搜索,控制台调用es的api和可视化等操作,特别需要注意的是,控制台可以非常方便的来调用es的api,强烈推荐使用

二、如何安装

直接下载对应平台的版本就可以,参考地址Installing Kibana
这里我直接下载了 windows 平台的 Kibana 8.5.0 | Elastic

配置可以参考Configring Kibana
设置监听端口号、es地址、索引名
img

默认情况下,kibana启动时将生成随机密钥,这可能导致重新启动后失败,需要配置多个实例中有相同的密钥
设置

xpack.reporting.encryptionKey: "chenqionghe"
xpack.security.encryptionKey: "122333444455555666666777777788888888"
xpack.encryptedSavedObjects.encryptionKey: "122333444455555666666777777788888888"

启动

./bin/kibana

打开http://localhost:5601,画风如下
img

提示我们可以使用示例数据,也可以使用自己已有的数据,我把示例数据都下载了,单击侧面导航中的 Discover 进入 Kibana 的数据探索功能:
img

可以看到数据已经导入了,我们可以直接使用查询栏编写语句查询
img

三、如何加载自定义索引

接下来演示加载已经创建book索引
单击 Management 选项
img

然后单击 Index Patterns 选项。
img

点击Create index pattern定义一个新的索引模式。
img

点击Next step
img

点击Create index pattern
img

出来如下界面,列出了所有index中的字段
img

接下来,我们再来使用一下kibana查看已经导入的索引数据
img
img

可以看到,已经能展示和检索出我们之前导入的数据,奥利给!

四、如何搜索数据

img
img

可以看到,我们能很方便地搜索栏使用Llucene查询,查询语法可以参考Lucene查询语法汇总

五、如何切换中文

config/kibana.yml添加

i18n.locale: "zh-CN"

重新启动,即可生效
img

六、如何使用控制台

控制台插件提供一个用户界面来和 Elasticsearch 的 REST API 交互。控制台有两个主要部分: editor ,用来编写提交给 Elasticsearch 的请求; response 面板,用来展示请求结果的响应。在页面顶部的文本框中输入 Elasticsearch 服务器的地址。默认地址是:“localhost:9200”。
点击左侧栏的[Dev Tools],可以看到如下界面,可以很方便地执行命令
img

示例操作

# 查看所有节点
GET _cat/nodes

# 查看book索引数据
GET book/_search
{
   
    "query": {
   
    "match": {
   
      "content": "chenqionghe"
    }
  }
}

# 添加一条数据
POST book/_doc 
{
   
  "page":8,
  "content": "chenqionghe喜欢运动,绳命是如此的精彩,绳命是多么的辉煌"
}

# 更新数据
PUT book/_doc/iSAz4XABrERdg9Ao0QZI
{
   
  "page":8,
  "content":"chenqionghe喜欢运动,绳命是剁么的回晃;绳命是入刺的井猜"
}

# 删除数据
POST book/_delete_by_query
{
   
  "query": {
   
    "match": {
   
      "page": 8
    }
  }
}

# 批量插入数据
POST book/_bulk
{
    "index":{
   } }
{
    "page":22 , "content": "Adversity, steeling will strengthen body.逆境磨练意志,锻炼增强体魄。"}
{
    "index":{
   } }
{
    "page":23 , "content": "Reading is to the mind, such as exercise is to the body.读书之于头脑,好比运动之于身体。"}
{
    "index":{
   } }
{
    "page":24 , "content": "Years make you old, anti-aging.岁月催人老,运动抗衰老。"}
{
    "index":{
   } }

img

七、如何使用可视化

Kibana可视化控件基于 Elasticsearch 的查询。利用一系列的 Elasticsearch 查询聚合功能来提取和处理数据,再通过创建图表来呈现数据分布和趋势

点击Visualize菜单,进入可视化图表创建界面,Kibana自带有上10种图表,我们来创建一个自己的图表
img

我们来添加一个直方图
img
img
img

可以看到,默认已经有一个Y轴了,统计的是数量,我们添加一个X轴,点击Buckets下的Add
img

如下,我选择了customer_id字段作为x轴
img

执行后如下
img

保存一下
img

八、如何使用仪表盘

Kibana 仪表板(Dashboard) 展示保存的可视化结果集合。
就是可以把上面定义好的图表展示
创建一个Dashboard
img

添加已经存在的图表
img
img

Kibana的使用就是这么简单,是不是觉得超简单,建议自己去安装使用一下,加深印象。

求关注点赞

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
3月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
433 0
|
2月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
146 0
|
3月前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
243 6
|
7月前
|
人工智能 运维 自然语言处理
Elasticsearch AI Assistant 集成 DeepSeek,1分钟搭建智能运维助手
Elasticsearch 新支持 DeepSeek 系列模型,使用 AI 助手,通过自然语言交互,为可观测性分析、安全运维管理及数据智能处理提供一站式解决方案。
886 3
Elasticsearch AI Assistant 集成 DeepSeek,1分钟搭建智能运维助手
|
7月前
|
人工智能 自然语言处理 搜索推荐
阿里云 AI 搜索开放平台集成 DeepSeek 模型
阿里云 AI 搜索开放平台最新上线 DeepSeek -R1系列模型。
364 2
|
7月前
|
人工智能 自然语言处理 搜索推荐
云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手
本文将为您带来“基于 PAI-RAG 构建 DeepSeek 联网搜索+企业级知识库助手服务”解决方案,PAI-RAG 提供全面的生态能力,支持一键部署至企业微信、微信公众号、钉钉群聊机器人等,助力打造多场景的AI助理,全面提升业务效率与用户体验。
|
8月前
|
人工智能 数据挖掘 API
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
R2R 是一款先进的 AI 检索增强生成平台,支持多模态内容处理、混合搜索和知识图谱构建,适用于复杂数据处理和分析的生产环境。
695 3
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
|
8月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
8月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
193 10
|
9月前
|
安全 Java 测试技术
springboot之SpringBoot单元测试
本文介绍了Spring和Spring Boot项目的单元测试方法,包括使用`@RunWith(SpringJUnit4ClassRunner.class)`、`@WebAppConfiguration`等注解配置测试环境,利用`MockMvc`进行HTTP请求模拟测试,以及如何结合Spring Security进行安全相关的单元测试。Spring Boot中则推荐使用`@SpringBootTest`注解简化测试配置。
374 4

热门文章

最新文章