【Elasticsearch】es初识,在项目架构中的用途,与mysql和kafka的配合使用,

ES是一个开源的高扩展的分布式全文检索引擎

在项目已有mysql增删改查的情况下,新增kafka,es流程

用户新增/修改商家(写MySQL)
↓
Kafka 生产者发送商家数据消息
↓
Kafka 消费者监听消息 → 写入 Elasticsearch
↓
前端搜索商家时 → 查询 Elasticsearch(不是 MySQL)

这个 Kafka + Elasticsearch 的写入同步 + 搜索解耦架构 是目前绝大多数中大型互联网企业的标准做法


一、为什么不能只查 MySQL而引入es查询?

传统做法的问题:

比如你在前端搜索商家名称“李大壮”,如果查的是 MySQL:

SELECT * FROM merchant WHERE name LIKE '%李大壮%' OR description LIKE '%李大壮%' LIMIT 10;

问题:

  • :LIKE + 多字段模糊查询在数据量大时性能非常差;
  • 不智能:MySQL 的模糊匹配不支持分词、不支持排序打分;
  • 不灵活:无法实现“相关度排序”“拼音搜索”“短语匹配”等搜索场景。

所以,企业通常引入 Elasticsearch(简称 ES)来替代 MySQL 作为 搜索引擎


二、为什么 MySQL 改动不直接同步到 Elasticsearch,而是先发 Kafka?

这是你最关键的问题:为什么加一层 Kafka?

原因一:解耦系统,避免写 ES 出错影响主业务

  • 如果你直接在写 MySQL 后同时写 ES,那么:

    • 如果 ES 挂了、网络抖动、接口异常等,会导致整个商家创建流程失败;
    • Kafka 相当于消息缓冲器 + 解耦层,即便 ES 挂了,Kafka 消息还能继续收集,等恢复后继续消费。

原因二:可支持异步、并发、大吞吐处理

  • Kafka 是高吞吐分布式系统,支持水平扩展(通过分区);
  • 消费者可以并行处理,批量写入 ES,系统更加稳定、可扩展。

原因三:可拓展更多下游系统,不只是 Elasticsearch

未来你可能还需要这些:

  • 同步商家数据到 Redis 缓存(做秒级展示);
  • 触发推送服务(比如新商家上线通知);
  • 同步用户画像系统、数据仓库。

如果有 Kafka,你只需要新增一个消费者;
如果没有 Kafka,你要改源代码、逻辑复杂,非常不利于维护。


三、流程总结:企业为什么这样做?

阶段系统作用
1MySQL业务主库,负责存储真实、结构化的数据
2Kafka消息中间件,做异步解耦、缓冲和流式处理
3Elasticsearch专用于搜索,支持全文检索、相关度评分等搜索功能
4前端直接查 ES,提升搜索速度、支持搜索功能增强

四、图示结构(简化):

      用户操作前端↓后端写 MySQL(商家表)↓┌────→ Kafka ←────┐│                 │Kafka Consumer     │(可以多个系统消费)↓                 ↓
ElasticSearch     Redis/OLAP等其他系统↓
前端搜索

es查询使用案例

query := map[string]interface{}{// DSL 查询主体"query": map[string]interface{}{"bool": map[string]interface{}{ // bool 组合查询(企业中常用)"must": []interface{}{ // must 表示“必须匹配”的条件,全部满足才返回map[string]interface{}{"multi_match": map[string]interface{}{ // 多字段模糊匹配"query":  in.Keyword, // 用户输入的搜索关键词(如“口腔”)"fields": []string{"name", "business", "address"},"type":   "most_fields", // type: most_fields → 各字段各自打分后相加,适合字段内容差异大;另一个选项 cross_fields 更适合字段语义接近。},},},"filter": filters, // 精准过滤器(如按省市区筛选,不能容忍模糊匹配)"should": []interface{}{ // 加分项,提升命中相关性map[string]interface{}{"match_phrase": map[string]interface{}{ "name": in.Keyword, // 要求关键词“完整连续地”出现在 name 中才能加分(如“牙科诊所”)},},map[string]interface{}{"match_phrase": map[string]interface{}{"business": in.Keyword, // business 完整短语匹配},},},// 注:should 不设置 minimum_should_match 时,不满足不会过滤掉,只是不加分},},// 分页设置"from": (in.Page - 1) * in.PerPage, // 从第几条开始取数据(起始位置)"size": in.PerPage,                // 每页返回多少条// 排序设置"sort": []interface{}{map[string]interface{}{"order_score": "desc", // 业务字段排序:order_score 是你在 merchant 映射里定义的字段,值越大代表权重越高。// 通常用于控制:优质商家排前面(如人工打分、运营配置)},},
}// -----------------
// 构造查询DSL// DSL:Domain-Specific Language(领域特定语言)// 这里表示一段用于构建或解析 Elasticsearch 查询语句的逻辑query := map[string]interface{}{"query": map[string]interface{}{"bool": map[string]interface{}{"must": []interface{}{map[string]interface{}{"multi_match": map[string]interface{}{ // multi_match 该字段使得查询支持不同类型的匹配模式// type 参数控制多字段匹配的方式,主要有两种:"query":  in.Keyword,"fields": []string{"name", "business", "address"},"type":   "most_fields", // 1.most_fields:把多个字段匹配结果 分开 算分,最后相加// 2.cross_fields:把多个字段 和在一起 匹配(适合同一个词,可能出现在name和business这种的情况)// 分数(score):Elasticsearch内部计算的相关度分值,用于衡量文档与查询的匹配程度,// 数值越大说明匹配越好,搜索结果排序默认会根据这个分数降序排列。},},},"filter": filters,// 其中should字段,主要作用是在满足上述条件下,增加相关度,缩小搜索范围。"should": []interface{}{ // should:表示“或”关系,满足should中条件的文档会被加分,提高其相关度排序,// 但文档不一定非要满足should中的条件才能匹配整个查询(除非设置minimum_should_match)。// 下面2map的效果:如果传入的name和business是能完全匹配的,则会获得更高的相关度评分。map[string]interface{}{"match_phrase": map[string]interface{}{ // match_phrase 是短语匹配,要求查询词,是顺序的不拆分的,否则匹配失败。"name": in.Keyword,},},map[string]interface{}{"match_phrase": map[string]interface{}{"business": in.Keyword,},},},},},"from": (in.Page - 1) * in.PerPage,"size": in.PerPage,"sort": []interface{}{ // 按照评分排序map[string]interface{}{"order_score": "desc"}, // 降序},}

https://github.com/0voice

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

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

相关文章

【DataWhale组队学习】AI办公实践与应用-数据分析

AI办公:数据分析 1. 使用大模型进行数据分析的常见流程 把数据扔给AI让AI自动分析,并告诉你结果 下面我们对上面两个步骤进行详细说明 2. 使用大模型进行数据分析 2.1 将数据扔给大模型 2.1.1 选择合适的办公大模型 要使用大模型进行数据分析时&a…

5G 浪潮:发展全景、困境突围与未来航向

在当今数字化浪潮中,5G 技术宛如一颗璀璨的明星,照亮了各个行业前行的道路。自 5G 正式商用以来,它不仅深刻改变了人们的生活方式,更在工业、农业、交通等领域掀起了一场数字化转型的革命。本文将深入探讨 5G 技术的原理、发展现状…

理论加案例,一文读懂数据分析中的分类建模

一、什么是分类 分类,是数据建模领域的重要分支,你每天也都会接触。 手机垃圾短信过滤,就是分类算法给短信打的标签,比如0代表正常短信,1代表垃圾短信。 在医学领域,根据影像检查判断肿瘤是良性还是恶性。…

数组题解——二分查找【LeetCode】

704. 二分查找 算法逻辑分析 初始化边界 left 设为0&#xff0c;right 设为len(nums)&#xff0c;表示左闭右开区间 [left, right)。这意味着搜索区间包含下标left&#xff0c;但不包含下标right。 循环条件 while left < right:&#xff0c;只要left小于right&#xff0c…

Function AI 工作流发布:以 AI 重塑企业流程自动化

作者&#xff1a;寒斜 在 AI 技术飞速发展的今天&#xff0c;企业的流程自动化方式也正在发生深刻变革。过去&#xff0c;流程自动化往往依赖于人工配置和固定规则&#xff0c;难以适应复杂、多变的业务场景。而如今&#xff0c;随着 LLM&#xff0c;Agent&#xff0c;MCP 等节…

【单元测试】单元测试的定义和作用

介绍 ‌单元测试不仅是对函数进行测试&#xff0c;还包括对类、组件等最小可测试单元的测试‌。单元测试是对软件中的最小可测试单元进行验证的过程&#xff0c;这些单元可以是函数、方法、类或组件等。单元测试的主要目的是确保这些最小单元在隔离的环境中能够正确地实现其功…

AI 辅助生成 Mermaid 流程图

文章目录 背景Mermaid使用 AI 编写 Mermaid应用 背景 在 markdown 文档中虽然可以插入图片&#xff0c;但是也需要管理图片&#xff0c;一旦图片位置变了&#xff0c;文档中的图片就无法显示。图片占用空间较大&#xff0c;对于在线文档&#xff0c;为了加载速度&#xff0c;能…

定位坐标系深度研究报告

一、引言 定位坐标系是用于描述地理位置的数学工具&#xff0c;其发展与人类对地球形状的认知和技术需求密切相关。早期的定位依赖于天文观测&#xff08;如经纬度&#xff09;&#xff0c;现代则结合卫星技术&#xff08;如GPS&#xff09;和数学投影方法&#xff08;如墨卡托…

数字孪生技术引领UI前端设计潮流:沉浸式体验的新篇章

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 当虚拟世界与物理现实的边界逐渐模糊&#xff0c;数字孪生技术正以燎原之势重构 UI 前端设计的…

VR油库虚拟仿真系统:开启智慧油库新时代

在科技快速发展的当下&#xff0c;VR 技术在多行业广泛应用&#xff0c;以沉浸式等特点重塑行业模式。油库作为石油储存与转运关键枢纽&#xff0c;传统运营管理依赖人工经验和常规设备&#xff0c;存在安全风险高、培训成本大等问题。在此背景下&#xff0c;油库引入 VR 虚拟仿…

Oracle获取前100条记录

在Oracle数据库中&#xff0c;获取前100条记录可以通过多种方式实现&#xff0c;最常见的方法是使用ROWNUM或者在较新版本的Oracle中使用FETCH FIRST子句。以下是几种常见的方法&#xff1a; 方法1&#xff1a;使用ROWNUM ROWNUM是Oracle特有的一个伪列&#xff0c;用于为结果…

【开源库 | libpng】使用 libpng 读写 png 文件详细教程(附带源码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Nuttx之nxsched_add_readytorun(non-SMP)

声明&#xff1a;此处代码分析&#xff0c;来源与 nuttx 12.8.0版本。 在分析之前&#xff0c;需要一图镇楼。 /***************************************************************************** Name: nxsched_add_readytorun** Description:* This function adds a TCB …

Nuttx之nxsched_add_blocked

声明&#xff1a;此处代码分析&#xff0c;来源与 nuttx 12.8.0版本。 在分析之前&#xff0c;需要一图镇楼。 /***************************************************************************** Name: nxsched_add_blocked** Description:* This function adds a TCB to o…

python 包含虚拟环境venv项目的移动

python 包含虚拟环境venv项目的移动 在ubuntu环境下&#xff0c;移动一个包含venv虚拟环境的项目后&#xff0c;在执行时会报错: 错误1&#xff1a; Traceback (most recent call last):File "app.py", line 2, in <module>from flask import Flask, request…

WPF中实现TreeView的SelectedItem双向绑定到ViewModel

WPF中实现TreeView的SelectedItem双向绑定到ViewModel WPF中实现TreeView的SelectedItem双向绑定到ViewModel问题背景解决方案一&#xff1a;附加行为&#xff08;推荐&#xff09;实现步骤优点 解决方案二&#xff1a;通过IsSelected属性绑定实现步骤注意事项 两种方案对比补充…

类型转换运算符重载

C 类型转换函数详解 类型转换函数是C中用于实现类类型与其他类型之间相互转换的特殊成员函数&#xff0c;分为两种主要形式&#xff1a;转换构造函数和类型转换运算符。 1. 转换构造函数 (Conversion Constructor) 基本概念 转换构造函数是一种特殊的构造函数&#xff0c;它…

ES10(ES2019)新特性整理

一、Array.prototype.flat() 和 flatMap()&#xff08;数组扁平化&#xff09; &#xff08;1&#xff09;flat(depth) 将嵌套数组“拉平”到指定深度&#xff08;默认 depth1&#xff09;。 const arr [1, [2, [3]]]; arr.flat(); // [1, 2, [3]]&#xff08;默认深度 …

基于 LCD1602 的超声波测距仪设计与实现:从原理到应用

具体材料可在主页资源里下载 超声波测距技术作为非接触式测量的重要手段&#xff0c;在工业检测、智能家居、机器人避障等领域有着广泛应用。本文将详细介绍一款基于 STC89C51 单片机与 LCD1602 显示屏的超声波测距系统&#xff0c;从硬件架构到软件实现&#xff0c;完整呈现一…

2.5G/5G/10G自协商An

IEEE 802.3 协议中&#xff0c;**2.5GBASE-T、5GBASE-T 和 10GBASE-T** 的链路自协商&#xff08;auto-negotiation&#xff0c;简称 AN&#xff09;是在物理层&#xff08;PHY&#xff09;完成的。它的作用是&#xff1a; * **让连接双方&#xff08;主机和对端&#xff09;自…