当前位置: 首页 > news >正文

深度解析ElasticSearch:构建高效搜索与分析的基石原创

引言

在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。

ElasticSearch 概述

产生背景

随着系统数据量的不断增长,传统的数据库解决方案在查询效率、单点故障和数据安全性等方面面临诸多挑战。为了应对这些问题,Elasticsearch应运而生。Elasticsearch不仅支持高效的全文检索,还具备分布式、可扩展、实时的搜索与数据分析能力,能够轻松处理PB级别的数据。

基本概念
  • 集群(Cluster):Elasticsearch集群由多个协同工作的节点组成,每个节点运行一个Elasticsearch实例。集群负责数据的分布式存储和查询。
  • 节点(Node):集群中的每个服务器称为节点,负责数据的存储、检索和索引。
  • 索引(Index):Elasticsearch中的索引是文档的集合,类似于关系型数据库中的数据库。每个索引可以包含多个分片。
  • 分片(Shard):索引被分割成多个分片,每个分片是一个Lucene索引的实例,可以独立存储和查询。分片是Elasticsearch实现水平扩展和负载均衡的关键。
  • 副本(Replica):为了提高系统的容错性和查询性能,每个分片可以有零个或多个副本。副本是分片的精确复制,可以在主分片不可用时接替其工作。

核心原理

倒排索引

Elasticsearch的核心是倒排索引,这是一种将单词映射到包含该词的文档的数据结构。通过倒排索引,Elasticsearch可以快速找到包含特定词的文档。倒排索引的查询流程包括:

  1. 通过倒排索引获得单词对应的一个或多个文档ID。
  2. 通过正排索引查询文档ID的完整内容。
  3. 返回用户最终结果。
分词(Analysis)

分词是将文本转换成一系列单词(term or token)的过程,是构建倒排索引的基础。Elasticsearch提供了分词器(Analyzer)组件,用于处理分词。分词器由三部分组成:Character Filters、Tokenizer、Token Filters,它们按顺序调用以完成分词过程。

相关性算分

在全文搜索中,如何将最符合用户查询需求的文档放在前列是一个关键问题。Elasticsearch通过相关性算分(relevance score)来解决这个问题。它根据文档与查询语句间的相关度进行排序,主要依赖于两个相关性算分模型:BM25和TF-IDF。

架构与扩展性

分布式架构

Elasticsearch采用分布式架构,数据被分割成多个分片,每个分片可以在不同的节点上进行复制和分布式存储。这种架构使得Elasticsearch能够实现数据的水平扩展和高可用性。

性能优化
  • 分片与副本配置:合理配置分片和副本的数量是性能优化的重要方面。较大的索引可以使用更多的分片来分散负载和提高吞吐量。副本数量的增加可以提高查询的并发性能和高可用性。
  • 硬件优化:使用高速的磁盘和足够的内存可以减少I/O延迟,提升Elasticsearch的性能。同时,确保网络带宽和节点之间的延迟也要考虑在内。
  • 索引设计:合理的索引设计可以提高搜索和写入的性能。例如,使用适当的字段类型和分词器,避免过度索引不必要的字段,以及合理设置索引的刷新间隔和合并策略等。
  • 查询优化:编写高效的查询可以提升搜索性能。使用合适的查询类型、过滤器、缓存查询结果以及使用批量操作等技巧都可以改善查询的性能。

实战案例与避坑指南

实战案例

假设我们有一个电商平台,需要实时搜索商品信息。我们可以使用ElasticSearch来构建商品搜索引擎,具体步骤包括:

  1. 设计索引结构:根据商品信息设计索引结构,包括商品ID、标题、描述、价格等字段。
  2. 导入数据:将商品数据批量导入到ElasticSearch索引中。
  3. 构建查询:构建高效的查询语句,支持关键词搜索、价格区间筛选等功能。
  4. 优化性能:通过合理配置分片和副本、优化硬件、调整索引策略等方式提升搜索性能。
避坑指南
  1. 避免过度索引:只索引需要搜索的字段,避免过度索引不必要的字段。
  2. 合理设置索引策略:根据业务需求合理设置索引的刷新间隔和合并策略。
  3. 优化查询:编写高效的查询语句,避免复杂的嵌套查询,使用过滤器和缓存机制提升查询性能。
底层技术的实现:

当然可以,以下是对ElasticSearch更多技术细节的深入解析:

1. 基于Apache Lucene构建

全文索引与倒排索引

  • 全文索引:ElasticSearch对文本数据进行分词、标准化、过滤等预处理后,将处理后的词汇(term)存储进索引中,使得用户可以针对这些词汇进行高效查询。
  • 倒排索引:ElasticSearch的核心数据结构,记录每个文档中出现的所有词汇及其在文档中的位置信息。查询时,系统直接查找包含查询词汇的文档列表,而非遍历每个文档,从而极大提高了搜索效率。
2. 分布式架构

节点与集群

  • 节点(Node):单个ElasticSearch实例,每个节点有唯一标识(node ID),可以存储数据、参与数据索引和查询处理。
  • 集群(Cluster):由一个或多个节点组成,共同维护整个数据集,并通过集群名称进行标识。节点间通过gossip协议自动发现彼此并形成集群。

分片与副本

  • 分片(Shard):为实现水平扩展,ElasticSearch将索引切分为多个分片。每个分片都是一个独立的Lucene索引,可以在不同节点上分布,分散存储压力和查询负载。
  • 副本(Replica):每个分片可以有零个或多个副本。副本提供数据冗余,确保高可用性,同时可以在查询时分摊负载。主分片负责写入操作,副本分片可用于读取请求。
3. 文档模型与动态映射

JSON文档

  • ElasticSearch使用JSON格式表示数据,每个JSON对象即为一个文档,文档归属于特定的索引。

动态映射(Dynamic Mapping)

  • 当新文档被索引时,如果没有预先定义映射(mapping),ElasticSearch会根据文档内容自动推断字段类型,并创建相应的映射规则。这使得用户可以快速开始索引数据,但需注意后期可能需要调整映射以优化性能和查询准确性。
4. 强大的查询与聚合功能

DSL查询

  • ElasticSearch使用JSON格式的查询语句(Domain Specific Language,DSL),提供了丰富的查询条件组合、排序、分页等功能。DSL查询包括简单查询、布尔查询、范围查询、模糊查询、通配符查询、正则表达式查询等。

分词器(Analyzer)

  • 在索引和查询阶段,ElasticSearch使用分词器对文本进行分析。分词器可以定制,包括分词算法、停用词过滤、同义词替换等,以适应不同的语言和应用场景。

聚合(Aggregations)

  • ElasticSearch支持多种聚合操作,如计数、求和、平均值、直方图、桶聚合等,用于对搜索结果进行统计分析,提取数据的深层洞察,如趋势、分布、关联等。
5. 实时性与近实时性

近实时索引(Near Real-Time, NRT)

  • 文档被索引后,通常在几秒钟内即可被搜索到。这是由于ElasticSearch使用了一个两阶段提交的过程,先将文档写入内存缓冲区(translog),然后定期刷新到磁盘,成为可供搜索的段(segment)。

刷新间隔(Refresh Interval)

  • 系统默认周期性(默认1秒)执行刷新操作,将缓冲区的变更提交到磁盘,确保新数据的近实时可见性。用户可以根据需求调整刷新间隔。
6. 高可用性与故障恢复

副本分配

  • 副本分片会被分配到不同的节点上,以防止单点故障导致数据丢失或不可用。

集群健康状态

  • ElasticSearch通过“红绿黄”灯系统表示集群健康状况,包括数据是否完整、分片是否分配均衡、节点是否在线等信息。

故障检测与自动恢复

  • 节点间通过心跳机制监测彼此状态。当检测到节点失败时,集群会自动重新分配其上的分片副本,确保数据可用性和查询服务连续性。
7. 扩展性与管理工具

水平扩展

  • 通过增加节点、调整分片数量和副本系数,可以轻松扩展存储容量和处理能力。

热升级

  • 支持滚动重启和版本升级,无需停机,保证服务持续可用。

监控与运维

  • Kibana提供图形化界面,用于监控集群状态、查询性能、资源使用情况等,便于运维人员管理和调优ElasticSearch集群。
8. 文本分析与分词

文本分析流程

  • 字符过滤:使用字符过滤器转变字符。
  • 文本切分为分词:将文本切分为单个或多个分词。
  • 分词过滤:使用分词过滤器转变每个分词。
  • 分词索引:将这些分词存储到索引中。
9. 相关性打分算法

TF-IDF与BM25

  • TF-IDF:一种统计方法,用以评估词条对于一个文档集或语料库中的其中一份文档的重要性。TF衡量词条在文档中出现的频率,IDF衡量词条的普遍重要性。
  • BM25:Elasticsearch 5.0及以后版本中采用的相关性排名函数,解决了TF-IDF中词频无限增加的问题,使得得分增长曲线趋于水平,更加平滑。BM25考虑了查询词在文档中出现的频率、在整个语料库中出现的频率以及文档的长度。

综上所述,ElasticSearch凭借其基于Lucene的强大全文索引能力、分布式架构、灵活的查询与聚合功能、实时性、高可用性以及丰富的扩展性和管理工具,成为处理大规模数据和高并发查询需求的首选搜索引擎。

实现高可用的原理:

Elasticsearch实现高可用主要依赖于其分布式架构和多种内部机制,具体包括以下几个方面:

1. 集群与节点
集群:Elasticsearch允许将多个节点组成一个集群,每个节点都可以存储数据并参与检索。集群通过统一的配置(如cluster.name)来标识,确保节点间能够相互发现和通信。
  • 节点:集群中的每个节点都是一个Elasticsearch实例,可以配置为承担不同的角色,如主节点、数据节点、协调节点等。这种分布式架构使得数据和服务可以在多个节点间共享和分担,从而提高系统的整体可用性和容错性。
2. 分片与副本
分片(Shard):Elasticsearch将索引切分成多个分片,每个分片是一个独立的Lucene索引,可以分布在不同的节点上。分片机制允许Elasticsearch水平扩展,以支持大规模数据集的高效处理。
  • 副本(Replica):为了提高数据的可用性和容错性,每个分片可以配置多个副本。副本是对主分片的精确复制,可以在主分片出现故障时接替其工作,确保数据不丢失且服务不间断。
3. 主节点选举
主节点:在Elasticsearch集群中,会选举一个节点作为主节点,负责协调集群的操作,如创建或删除索引、管理节点状态、分配分片等。
  • 选举机制:当主节点出现故障时,集群中的其他节点会自动进行新一轮的主节点选举,确保集群始终有一个主节点来管理集群状态。这种选举机制保证了集群的高可用性,避免了单点故障导致的服务中断。
4. 故障转移与自动恢复
故障检测:Elasticsearch通过节点间的心跳机制来检测故障。当某个节点出现故障时,集群能够迅速感知并采取相应的应对措施。
  • 故障转移:当主节点或数据节点出现故障时,集群会自动将故障节点上的分片重新分配到其他健康的节点上,确保数据的可用性和服务的连续性。对于主节点故障,集群还会进行主节点选举来恢复集群的管理功能。
  • 自动恢复:Elasticsearch还提供了自动恢复机制,能够在节点恢复后重新加入集群并恢复其原始角色和数据分片。
5. 负载均衡
分片分配策略:Elasticsearch通过智能的分片分配策略来确保数据在节点间的均衡分布,避免某些节点负载过重而其他节点空闲的情况。
  • 动态调整:随着集群规模的变化和节点状态的更新,Elasticsearch能够动态调整分片分布以优化性能和可用性。
6. 缓存与持久化
缓存机制:Elasticsearch利用多种缓存机制来提高查询性能,包括查询缓存、字段数据缓存等。这些缓存机制能够减少对磁盘的访问次数,从而加快查询速度。
  • 持久化:为了确保数据的可靠性,Elasticsearch会将数据定期刷新到磁盘上。同时,它还通过事务日志(如translog)来记录数据变更操作,以便在系统崩溃后能够恢复未持久化的数据。
7. 监控与管理
监控工具:Elasticsearch提供了丰富的监控工具(如Kibana)来实时查看集群的健康状态、节点状态、分片分布等信息。这些工具能够帮助运维人员及时发现并解决问题。
  • 管理工具:Elasticsearch还支持通过REST API进行集群管理,包括索引的创建、删除、更新以及分片和副本的配置等。这使得运维人员能够灵活地调整集群配置以优化性能和可用性。

综上所述,Elasticsearch通过其分布式架构、分片与副本机制、主节点选举、故障转移与自动恢复、负载均衡、缓存与持久化以及监控与管理等多种机制共同实现了高可用。这些机制确保了Elasticsearch能够在面对硬件故障、网络问题等异常情况时仍然能够提供稳定的服务。

结论

ElasticSearch作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。通过深入理解其核心原理、架构设计及优化实践,我们可以更好地利用这一工具来应对海量数据的挑战。希望本文能为读者提供有价值的参考和启示。

相关文章:

深度解析ElasticSearch:构建高效搜索与分析的基石原创

引言 在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。…...

【Python常用模块】_PyMySQL模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…...

【算法思想·二叉树】最近公共祖先问题

本文参考labuladong算法笔记[拓展:最近公共祖先系列解题框架 | labuladong 的算法笔记] 0、引言 如果说笔试的时候经常遇到各种动归回溯这类稍有难度的题目,那么面试会倾向于一些比较经典的问题,难度不算大,而且也比较实用。 本…...

如何合并pdf文件,四款软件,三步搞定!

在数字化办公的浪潮中,PDF文档因其跨平台兼容性和安全性,成为了我们日常工作中不可或缺的一部分。然而,面对多个PDF文件需要整合成一个文件时,不少小伙伴可能会感到头疼。别担心,今天我们就来揭秘四款高效PDF合并软件&…...

仪表放大器AD620

AD623 是一款低功耗、高精度的仪表放大器,而不是轨到轨运算放大器。它的输入电压范围并不覆盖整个电源电压(轨到轨),但在单电源供电下可以处理接近地电位的输入信号。 AD620 和 AD623 都是仪表放大器,但它们在一些关键…...

【Qt网络编程】Tcp多线程并发服务器和客户端通信

目录 一、编写思路 1、服务器 (1)总体思路widget.c(主线程) (2)详细流程widget.c(主线程) (1)总体思路chat_thread.c(处理聊天逻辑线程&…...

SkyWalking 简介

SkyWalking是什么 skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用 程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。它是一款优秀的 APM(Application Performance Manag…...

语音合成(自然、非自然)

1.环境 Python 3.10.14 2.完成代码 2.1简陋版 import pyttsx3# 初始化tts引擎 engine pyttsx3.init()# 设置语音速度 rate engine.getProperty(rate) engine.setProperty(rate, rate - 50)# 设置语音音量 volume engine.getProperty(volume) engine.setProperty(volume, …...

redis简单使用与安装

redis redis 是什么 Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。 一、存储系统特性 内存存储与持久化 Redis 主要将数据存储在内存中,这…...

封装 WBXpopup 组件

这是Popup组件基于微博小程序&#xff0c;需要改变标签&#xff0c;以及一写方法 支持四个方向抽屉&#xff0c;以及中间弹出功能 // 用法 <template><wbx-view style"height: 100vh;"><!-- 对话框组件 --><wbx-view><wbx-text click&quo…...

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…...

详解:Tensorflow、Pytorch、Keras(搭建自己的深度学习网络)

这是一个专门对Tensorflow、Pytorch、Keras三个主流DL框架的一个详解和对比分析 一、何为深度学习框架&#xff1f; 你可以理解为一个工具帮你构建一个深度学习网络&#xff0c;调用里面的各种方法就能自行构建任意层&#xff0c;diy你想要的DNN&#xff0c;而且任意指定学习…...

【CSS in Depth 2 精译_035】5.5 Grid 网格布局中的子网格布局(全新内容)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…...

Java是怎么处理死锁的

文章目录 避免死锁避免嵌套锁资源进行排序超时锁 检测死锁通过Java提供的API检查死锁情况jStack监控工具 Java 本身没有内置的机制自动处理死锁问题&#xff0c;但可以采取一些策略和技术来检测和避免死锁。 避免死锁 避免嵌套锁 尽可能减少嵌套锁操作&#xff0c;避免在一个…...

Effective Java 学习笔记 方法签名设计

目录 谨慎选择方法名称 不要过于追求提供便利的快捷方法 避免过长的参数列表 对于参数类型优先使用接口而不是类 对于boolean参数&#xff0c;要优先使用两个元素的枚举类型 本文接续前一篇文章聚焦Java方法签名的设计&#xff0c;方法签名包括了方法的输入和输出参数以及…...

毛利超70%、超70+智驾客户,这家AI数据训练服务商刚刚止亏

AI训练数据服务第一股海天瑞声终于迎来了“曙光”。 日前&#xff0c;海天瑞声发布2024年半年报显示&#xff0c;上半年其实现营收9242.63万&#xff0c;同比增长24.13%&#xff1b;实现净利润41.64 万元&#xff0c;不过同比去年同期的亏损1724.14万元&#xff0c;扭亏为盈。…...

本地部署高颜值某抑云音乐播放器Splayer并实现无公网IP远程听歌

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

图像压缩编码(4)--H.26x系列视频压缩编码_2

目录 H.261 视频编码标准 H.261的编码与解码 1&#xff09; 帧内/帧间编码 2&#xff09;运动补偿 3&#xff09;量化 4&#xff09;环路滤波器 5&#xff09;缓存器 压缩数据的分层 数据复用结构 H.264的编码与解码 H.261 视频编码标准 实际应用时&#xff0c;要求有…...

JS渲染锻炼输入表单

前言 上篇文章为大家展现了好看的信息窗口&#xff0c;接下来我们跟着流程图看下一步 之前我们的带点击事件已经添加完毕&#xff0c;下一步就是当用户点击的时候&#xff0c;渲染锻炼形式&#xff0c;当然这是一个标签&#xff0c;可以提供给用户输入锻炼形式 实例 ● 我…...

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…...

决策树+随机森林模型实现足球大小球让球预测软件

文章目录 前言一、决策树是什么&#xff1f;二、数据收集与整理1.数据收集2.数据清洗3.特征选择 三、决策树构建3.1绘制训练数据图像3.2 训练决策树模型3.3 依据模型绘制决策树的决策边界3.4 树模型可视化 四、模型预测五、随机森林模型总结 前言 之前搞足球数据分析的时候&…...

31省市农业地图大数据

1.北京市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 2.天津市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 3.黑龙江省 谷类作物种植结构&#xff08;万亩&#xff09; 农作物…...

http请求包含什么

HTTP请求通常包含以下几个主要部分&#xff1a; 请求行&#xff08;Request Line&#xff09;&#xff1a; 包含请求方法&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;、请求的目标 URI 和 HTTP 版本。例如&#xff1a;GET /index.html HTTP/1.1 请求头部&#xff08;…...

【基础算法总结】模拟篇

目录 一&#xff0c;算法介绍二&#xff0c;算法原理和代码实现1576.替换所有的问号495.提莫攻击6.Z字形变换38.外观数列1419.数青蛙 三&#xff0c;算法总结 一&#xff0c;算法介绍 模拟算法本质就是"依葫芦画瓢"&#xff0c;就是在题目中已经告诉了我们该如何操作…...

《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>

目录 一、回顾神经网络框架 1、单层神经网络 2、多层神经网络 二、手写数字识别 1、续接上节课代码&#xff0c;如下所示 2、建立神经网络模型 输出结果&#xff1a; 3、设置训练集 4、设置测试集 5、创建损失函数、优化器 参数解析&#xff1a; 1&#xff09;para…...

【笔记】材料分析测试:晶体学

晶体与晶体结构Crystal and Crystal Structure 1.晶体主要特征 固态物质可以分为晶态和非晶态两大类&#xff0c;分别称为晶体和非晶体。 晶体和非晶体在微观结构上的区别在于是否具有长程有序。 晶体&#xff08;长程有序&#xff09;非晶&#xff08;短程有序&#xff09…...

飞塔Fortigate7.4.4的DNS劫持功能

基础网络配置、上网策略、与Server的VIP配置&#xff08;略&#xff09;。 在FortiGate上配置DNS Translation&#xff0c;将DNS请求结果为202.103.12.2的DNS响应报文中的IP地址修改为Server的内网IP 10.10.2.100。 config firewall dnstranslationedit 1set src 2.13.12.2set…...

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式&#xff08;State Pattern&#xff09; 1、什么时候使用状态模式 2、使用状态模式的…...

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码

目录 1. RabbitMQ 核心概念 1.1生产者和消费者 1.2 Connection和Channel 1.3 Virtual host 1.4 Queue 1.5 Exchange 1.6 RabbitMO工作流程 2. AMQP 3.RabbitMO快速入门 3.1.引入依赖 3.2.编写生产者代码 ​3.3.编写消费者代码 4.源码 1. RabbitMQ 核心概念 在安装…...

openmv与stm32通信

控制小车视觉循迹使用 OpenMV 往往是不够的。一般使用 OpenMV 对图像进行处理&#xff0c;将处理过后的数据使用串口发送给STM32&#xff0c;使用STM32控制小车行驶。本文主要讲解 OpenMV 模块与 STM32 间的串口通信以及两种循迹方案&#xff0c;分别是划分检测区域和线性回归。…...