在业务开发中使用ElasticSearch的指导手册

文章目录

  • 该业务为什么需要ElasticSearch? / 该业务需要ElasticSearch的核心功能是哪些?
    • 正确示例
    • 错误示例
  • 如何快速验证分词是否能够满足业务需求?
    • 分词不满足,如何自定义分词?
  • 业务数据的字段类型映射是否合理?
  • 实践中如何使用IndexTemplate,Index Alias?
  • 业务数据是否可修改?
  • 业务数据需要保留多长时间?/ 如何配置生命周期管理?
  • 业务数据的增长情况估算?容量估算?
  • 最后

本篇博文分享自己在实践中使用ElasticSearch进行业务开发的一些心得。只讨论应用程序和ElasticSearch交互,至于其他组件,例如Kafak和ElasticSearch的集成则不在本篇博文讨论范围之内。

在业务中使用ElasticSearch中时建议将下列事项作为检查清单,根据实际情况来增减,确保自己在开发过程中思考了下列事项并结合实际情况来完成最终的设计、开发。

该业务为什么需要ElasticSearch? / 该业务需要ElasticSearch的核心功能是哪些?

在使用ES时,我们要问自己的第一个问题是,我为什么拿ES来解决当前业务中的问题?对于该业务的技术问题,团队内的现有技术栈和ES相比有哪些不足?一定要有充足的理由。

正确示例

  1. 业务需要一个推荐系统,可以利用ES的分词能力来做这件事
  2. 对于海量数据的模糊查询,已经对数据库索引和代码进行了优化,查询起来还是很慢。所以将数据库的数据同步至ES中,利用ES强大的缓存能力来帮助我们提高模糊查询的性能。

错误示例

  1. 我看ES好像能干这事,而且网上很多解决方案也是这个。那我们就用。(没有结合当前情况进行思考,直接进行照搬的)

如何快速验证分词是否能够满足业务需求?

大部分使用ES场景还是和其分词功能有关。

一个常见的错误开发流程是,上来就开干,直接写代码,周边代码撸完了,结果到最后发现分词有各种各样的问题。所以对于这种关键的问题,我们一开始就要对其验证,只有核心分词没问题且能满足我们的业务需求了,再写代码也不迟。

可以根据业务需求找到合适的内置分词器。找到分词器之后,用一些示例文本在Kibana > Dev Tool中测一下分词效果,见如何测试分词器,例如,我想测一下标准分词器对我们业务的一些文本的分词结果

POST _analyze
{"analyzer": "standard","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

这种方式你能在几个小时之内快速知道哪些分词器能满足当前业务场景并及时反馈给产品团队进行沟通,在需求前期就能快速辨别该需求能不能做,而不是拍着胸脯说,没问题,然后撸了一堆代码,发现业务核心根本没办法实现,自己给自己挖了一个坑。

分词不满足,如何自定义分词?

有很多场景使用内置的分词器可能不满足,例如:使用ES完全达到和数据库like的效果。

自定义分词只需要看官方文档下面几个内容

  1. 创建自定义分词器
  2. 为某个字段指定分词器

创建完自定义分词器切记不要忘了上面一条,要先测试过确保没问题,才可进行下一步

业务数据的字段类型映射是否合理?

确定核心分词字段没问题了之后,接下来就要为整个index建立完整的mapping字段。关于字段类型可直接参考官方文档field data types部分,根据实际业务数据类型选择合适的字段类型。同时结合官方文档中的优化索引速度和优化搜索速度中有关index的建议,设计出合理,高效的结构。

实践中如何使用IndexTemplate,Index Alias?

  1. 建议使用IndexTemplate并按照业务的数据特点对index进行分区。例如,我们需要把每年的订单数据导入到ES中以便快速检索,我们只提供近5年的数据搜索。我们会将index按照年分区,可根据查询区间直接搜索相关的年的index而不是所有index;删除的时候直接将该index删除即可。
  2. 无论现在用不用Index Alias,我都建议为index设置alias。

业务数据是否可修改?

如果你的业务数据不涉及到更新,写进去就是之后就是查询,类日志数据,强烈建议使用datastream

业务数据需要保留多长时间?/ 如何配置生命周期管理?

index结构创建好了之后,一个关键的问题是该数据需要在ES中保留多长时间,因为机器资源是有限的,不可能不加任何限制的存储数据。

这个问题需要产品团队给出明确的答案。有了明确的期限之后,我们要根据实际情况为index设置生命周期策略。虽然这些活编程式也能干,但是ES既然提供了这个工具,干嘛不用它的呢。有关生命周期的各配置细节解释和具体配置可参考这篇博文

业务数据的增长情况估算?容量估算?

在业务上线之前,需要预估该业务上线后ES中数据容量情况,以便确定当前ES的机器资源是否满足需要,如果不满足应该扩充多少?预估容量也有助于避免由于数据量突增导致ES压力增大,影响到其他使用到ES的业务。

如何正确的计算ES所需要的机器资源呢?我一开始的想法是,计算每条document在ES中的存储大小,然后根据产品给出的预估量,简单计算所需总存储大小是多少。后来发现,社区问过类似的问题,回答是这样没办法做也不建议这样做。因为ES存储会做各种优化、压缩。不可能通过这种方式计算出来,即使算出来也是不准确的。

唯一的可行方法是,预估上线之后数据量有多大,然后按照这个数据量灌到ES里去,观察ES的压力情况,根据实际情况做调整

最后

上述所有项都是在业务开发中值得注意的地方。我并没有把每一步的解决方案都详细的写出来,是因为解决方案里链接了大量的官方文档,跟着官方做就可以实现。

真正写代码往往是上述大部分问题都已经确定了之后才开始。

如有更好的开发实践,欢迎留言讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL设置表自增步长

在MySQL数据库管理中,自增字段(AUTO_INCREMENT)是一种常见且重要的功能,通常用于生成唯一的标识符(如主键)。然而,在多种应用场景下,默认的自增步长(1)可能无…

【InternLM实战营第二期笔记】02:大模型全链路开源体系与趣味demo

文章目录 00 环境设置01 部署一个 chat 小模型02 Lagent 运行 InternLM2-chat-7B03 浦语灵笔2 第二节课程视频与文档: https://www.bilibili.com/video/BV1AH4y1H78d/ https://github.com/InternLM/Tutorial/blob/camp2/helloworld/hello_world.md 视频和文档内容基…

003 CentOS 7.9 mysql8.3.0安装及配置

文章目录 Windows PowerShell测试端口安装及配置1. 下载MySQL安装包2. 解压安装包3. 安装MySQL4. 启动MySQL服务5. 获取并设置MySQL root密码6. 创建数据库7. 配置远程连接(可选) 卸载mysql检查并卸载已有的MySQL或MariaDB: https://download…

云计算和大数据处理

文章目录 1.云计算基础知识1.1 基本概念1.2 云计算分类 2.大数据处理基础知识2.1 基础知识2.3 大数据处理技术 1.云计算基础知识 1.1 基本概念 云计算是一种提供资源的网络,使用者可以随时获取“云”上的资源,按需求量使用,并且可以看成是无…

AWS安全性身份和合规性之WAF(Web Application Firewall)

AWS WAF(Web Application Firewall)是一项AWS托管的网络安全服务,用于保护Web应用程序免受常见的Web攻击,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等。 应用场景:…

STM32应用开发进阶--IIC总线(SHT20温湿度+HAL库_硬件I2C)

实现目标 1、掌握IIC总线基础知识; 2、会使用软件模拟IIC总线和使用STM32硬件IIC总线; 3、 学会STM32CubeMX软件关于IIC的配置; 4、掌握SHT20温湿度传感器的驱动; 5、具体目标:(1)用STM32硬件IIC驱动S…

49 序列化和反序列化

本章重点 理解应用层的作用,初识http协议 理解传输层的作用,深入理解tcp的各项特性和机制 对整个tcp/ip协议有系统的理解 对tcp/ip协议体系下的其他重要协议和技术有一定的了解 学会使用一些网络问题的工具和方法 目录 1.应用层 2.协议概念 3. 网络计…

CSRF跨站请求伪造实战

目录 一、定义 二、与XSS的区别 三、攻击要点 四、实战 一、定义 CSRF (Cross-site request forgery,跨站请求伪造),攻击者利用服务器对用户的信任,从而欺骗受害者去服务器上执行受害者不知情的请求。在CSRF的攻击场景中,攻击…

Django模板层——模板引擎配置

作为Web 框架,Django 需要一种很便利的方法以动态地生成HTML。最常见的做法是使用模板。 模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。 模板引擎配置 模板引擎使用该TEMPLATES设置进行配置。这是一个配置列…

C++数据结构——哈希桶HashBucket

目录 一、前言 1.1 闭散列 1.2 开散列 1.3 string 与 非 string 二、哈希桶的构成 2.1 哈希桶的节点 2.2 哈希桶类 三、 Insert 函数 3.1 无需扩容时 3.2 扩容 复用 Insert: 逐个插入: 优缺点比对: 第一种写法优点 第一种写法…

gfast:基于全新Go Frame 2.3+Vue3+Element Plus构建的全栈前后端分离管理系统

gfast:基于全新Go Frame 2.3Vue3Element Plus构建的全栈前后端分离管理系统 随着信息技术的飞速发展和数字化转型的深入,后台管理系统在企业信息化建设中扮演着越来越重要的角色。为了满足市场对于高效、灵活、安全后台管理系统的需求,gfast应…

OpenUI 可视化 AI:打造令人惊艳的前端设计!

https://openui.fly.dev/ai/new 可视化UI的新时代:通过人工智能生成前端代码 许久未更新, 前端时间在逛github,发现一个挺有的意思项目,通过口语化方式生成前端UI页面,能够直观的看到效果,下面来给大家演示下 在现代…

SAP FS00如何导出会计总账科目表

输入T-code : S_ALR_87012333 根据‘FS00’中找到的总账科目,进行筛选执行 点击左上角的列表菜单,选择‘电子表格’导出即可

echarts-地图

使用地图的三种的方式: 注册地图(用json或svg,注册为地图),然后使用map地图使用geo坐标系,地图注册后不是直接使用,而是注册为坐标系。直接使用百度地图、高德地图,使用百度地图或高德地图作为坐标系。 用json或svg注…

C++中string类的初步介绍

C语言中的字符串 在C语言中,字符串是以\0结尾的一些字符的集合,C标准库中提供了一系列str系列的库函数,但这些库函数与字符串是分离的,不符合面向对象的编程思想。 string类的大致介绍 1.string是表示字符串的字符串类 2.stri…

GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI

LLaMA 模型的第三代,是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数,训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…

pycharm画图猫和老鼠

在PyCharm中,你可以使用turtle模块来画图。以下是一个简单的例子,展示如何使用turtle模块来绘制一个猫和一个老鼠。 import turtle # 设置窗口标题 turtle.title("画图猫和老鼠") # 创建两个turtle对象,一个用于绘制猫&#xf…

AWS联网和内容分发之API Gateway

Amazon API Gateway是一种完全托管的服务,可以帮助开发人员轻松创建、发布、维护、监控和保护任意规模的API。API充当应用程序的前门,可从您的后端服务访问数据、业务逻辑或功能。使用API Gateway,您可以创建RESTful API和WebSocket API&…

lightGBM 集成学习模型 - 以银行风控业务为例

LightGBM(Light Gradient Boosting Machine)是基于梯度提升决策树(GBDT)的一种改进实现。其核心思想是通过加法模型(additive model)和前向分布算法(forward distribution algorithm&#xff09…

Qt pro工程文件编写汇总(区分debug和release、32位和64位的方法,编译输出目录等)

前言: 从事qt开发已经好几年了,但有关pro编写的一些细节问题一直没有一个很好的梳理汇总——因为实际工作开发中,往往只需要编译特定版本的软件(例如32位release版本),项目创建好后并设置好编译路径&#x…