Elasticsearch 搜索测试与集成Springboot3

本文涉及的产品
无影云电脑个人版,黄金款:40核时/1个月有效
资源编排,不限时长
无影云电脑企业版,4核8GB 120小时 1个月
简介: 它能够一定程度上解决,在一个普通数据库处理上亿条数据时的查询效率低下的同时无法优秀地排列好用户所需要的数据,一次性上亿条数据没有经过正确地排列,用户很难找到想要的数据。并且,用户输入的数据可能不太准确,它也能够进行模糊查询,这种模糊查询是依靠计算得来的,而不是简单地匹配数据。本系列博文将从零开始一步步实现将 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

添加完后保存即可,我们可以定制出非常丰富的面板,如下
img

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

求关注点赞

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
9天前
|
敏捷开发 jenkins Devops
探索软件测试的新篇章:自动化与持续集成的融合之道
【9月更文挑战第31天】 在软件开发的海洋中,测试是确保航船稳健前行的灯塔。本文将引领读者驶入软件测试的新纪元,探索自动化测试和持续集成如何携手共创高效、可靠的开发流程。我们将从基础概念出发,逐步深入到实际操作层面,揭示这一现代软件开发模式的核心价值和实现路径。你将看到,通过代码示例和实践案例,如何将理论转化为提升软件质量的具体行动。
|
1天前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
10 0
|
1天前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
10 0
|
25天前
|
Ubuntu jenkins 测试技术
软件测试中的自动化与持续集成实践
【9月更文挑战第15天】在软件开发的快节奏世界中,自动化测试和持续集成(CI)已成为确保质量和效率的关键策略。本文旨在揭示如何通过实施自动化测试框架和CI流程来优化开发周期,减少人为错误,并加快产品上市时间。我们将探讨一些实用的工具和技术,以及它们如何帮助团队实现更流畅、更可靠的软件发布。
|
25天前
|
敏捷开发 jenkins Devops
软件测试的新篇章:自动化与持续集成的融合
【9月更文挑战第15天】在软件开发领域,质量保障始终是核心议题。随着敏捷开发的普及和DevOps文化的兴起,自动化测试和持续集成(CI)已成为现代软件工程不可或缺的组成部分。本文将深入探讨自动化测试的重要性、实施策略以及如何将其无缝集成到CI流程中,以实现更高效、更稳定的软件开发周期。通过具体案例分析,我们将揭示自动化测试和CI如何相互促进,提升软件交付的速度和质量。
|
28天前
|
监控 安全 测试技术
提升软件测试效率:探索持续集成的最佳实践
在现代软件开发过程中,持续集成(CI)已成为提高软件质量和测试效率的关键实践。通过将代码库的每次提交自动构建和测试,CI 帮助团队及时发现问题,减少手动测试的负担。本文探讨了如何有效实施持续集成来优化软件测试流程,并提供了一些实用的策略和工具建议,以帮助开发团队更高效地运作。
52 2
|
28天前
|
JavaScript 前端开发 Java
Spring Boot+cucumber+契约测试
Spring Boot+cucumber+契约测试
12 0
Spring Boot+cucumber+契约测试
|
1月前
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
34 4
|
2月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
40 0
|
2月前
|
测试技术 持续交付 开发者
Xamarin 高效移动应用测试最佳实践大揭秘,从框架选择到持续集成,让你的应用质量无敌!
【8月更文挑战第31天】竞争激烈的移动应用市场,Xamarin 作为一款优秀的跨平台开发工具,提供了包括单元测试、集成测试及 UI 测试在内的全面测试方案。借助 Xamarin.UITest 框架,开发者能便捷地用 C# 编写测试案例,如登录功能测试;通过 Xamarin 模拟框架,则可在无需真实设备的情况下模拟各种环境测试应用表现;Xamarin.TestCloud 则支持在真实设备上执行自动化测试,确保应用兼容性。结合持续集成与部署策略,进一步提升测试效率与应用质量。掌握 Xamarin 的测试最佳实践,对确保应用稳定性和优化用户体验至关重要。
48 0