【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?
Elasticsearch 深度解析:从原理到实践
一、为什么选择 Elasticsearch?
数据模型
Elasticsearch 是基于文档的搜索引擎,它使用 JSON 文档来存储数据。在 Elasticsearch 中,相关的数据通常存储在同一个文档中,而不是分散在多个表中。
MySQL 是一个关系型数据库管理系统,它使用表、行和列的结构来组织数据。数据通过外键关系分散在多个表中。
查询语言
Elasticsearch 使用 Query DSL(Domain Specific Language),这是一种非常灵活的查询语言,基于 JSON,支持全文搜索、复合查询、过滤以及聚合等。
MySQL 使用 SQL(Structured Query Language),这是一种强类型和非常成熟的语言,专门用于查询和管理关系数据库。
全文搜索
Elasticsearch 的核心功能是全文搜索。它对数据进行索引时会自动建立全文搜索索引,使其在搜索大量文本数据时表现优异。
MySQL 虽然也提供了基本的全文搜索功能,但其主要设计目标是处理结构化数据的存储和查询,对全文搜索的支持不如 Elasticsearch 那样强大。
事务支持
Elasticsearch 不支持传统的 ACID(原子性、一致性、隔离性、持久性)事务。虽然它确保了单个文档操作的原子性,但不适用于跨多个文档的复杂事务。虽然 Elasticsearch 不支持传统的事务,但是他是可以确保单个文档的更改(如创建、更新、删除)是原子性的。这意味着任何文档级的操作都完整地成功或完整地失败,但不保证跨多个文档或操作的一致性。
MySQL 支持 ACID 事务,这使得它非常适合需要严格数据一致性的应用,如金融服务和其他商业数据处理。
支持乐观锁:
Elasticsearch 支持通过使用文档版本控制来实现乐观锁。
6.7之前。在 ES 中,每个文档存储时都有一个 _version 字段,这个版本号在每次文档更新时自动增加。当我们执行更新、删除或者使用脚本处理文档时,可以指定这个版本号来确保正在操作的文档是预期中的版本。如果操作中的版本号与存储在索引中的文档版本号不一致,说明文档已被其他操作更改,当前操作将会失败。(CAS)
为什么_version在后续版本被抛弃
_version 机制是基于单一递增整数,它主要适用于简单的冲突检测,但在复杂的分布式系统中,仅依靠版本号可能无法准确地反映数据的历史和复制状态。尤其是在发生网络分区或节点故障时,仅凭 _version 可能导致数据丢失或过时的数据被错误地写入。
主要还是在高并发和高可用的环境下,单一的-version不足以处理因节点故障或网络问题导致的多个副本之间的数据不一致问题。
然而if_seq_no 和 if_primary_term这两个参数可以更准确地确定操作是否应当被执行,可以跟踪每个文档变更的序列号和主分片的期限。这种机制帮助确保即使在集群状态发生变化(如分片重新分配到新的节点)的情况下,也不会应用基于过时副本的更新。它有效地防止了脑裂问题。
6.7之后,使用 _version 关键字进行乐观锁已经被废弃了,替代方法是使用
if_seq_no (是一个递增的序列号,表示文档的每次修改)和
if_primary_term(表示主分片的当前任期,每当主分片发生变化时,这个值会增加。)
来指定版本。
1. 核心优势()
维度 | Elasticsearch | MySQL |
---|---|---|
数据模型 | 文档型(JSON),动态映射 | 关系型(严格Schema) |
搜索能力 | 全文检索、模糊匹配、语义分析 | 仅支持精确查询和简单LIKE |
扩展性 | 分布式架构,自动分片/副本 | 分库分表复杂 |
吞吐量 | 单集群支持每秒10万+查询 | 高并发写入更优 |
一致性 | 最终一致性(近实时) | 强一致性(ACID) |
Elasticsearch是一个开源的分布式搜索和分析引擎,主要适用于以下场景:
1:搜索引擎:用于快速检索文档、商品、新闻等。
2:日志分析:通过分析日志数据,帮助企业了解其业务的性能情况。
3:数据分析:帮助数据科学家和数据分析师进行数据分析,以获取有价值的信息。
4:商业智能:帮助企业制定数据驱动的决策,以实现商业上的成功。
5:实时监控:帮助企业实时监测系统性能、监控数据变化,以保证系统正常运行。
6:安全性:帮助企业保证数据的安全性,保证数据不被非法窃取。
7:应用程序开发:帮助开发人员开发基于搜索的应用程序,以增加用户体验。
Elasticsearch具有以下几个优势:
1:高性能:Elasticsearch具有高性能的搜索和分析能力,其中涵盖了多种查询语言和数据结构。
2:可扩展性:Elasticsearch是分布式的,可以通过增加节点数量扩展搜索和分析能力。
3:灵活性:Elasticsearch支持多种数据类型,支持多种语言,支持动态映射,允许快速地调整模型以适应不同的需求。
4:实时分析:Elasticsearch支持实时分析,可以对数据进行实时查询,这对于快速检索数据非常有用。
5:可靠性:Elasticsearch具有可靠性和高可用性,支持数据备份和恢复。
ES为什么块:
1:分布式存储:Elasticsearch使用分布式存储技术,将数据存储在多个节点上,从而减少单个节点的压力,提高整体性能。
2:索引分片:Elasticsearch把每个索引划分成多个分片,这样可以让查询操作并行化,从而提高查询速度。
3:全文索引:Elasticsearch使用了高效的全文索引技术,把文档转化成可搜索的结构化数据,使得搜索操作快速高效。
4:倒排索引:Elasticsearch支持倒排索引这种数据结构,倒排索引将文档中的每个词与该词出现在哪些文档中进行映射,并存储这些信息。当搜索请求发生时,ES可以快速查找包含所有搜索词的文档,从而返回结果。
5:索引优化:Elasticsearch通过索引优化技术,可以使查询速度更快。例如,它支持索引覆盖、索引下推等优化技术,使得查询速度更快。
6:预存储结果:Elasticsearch在插入数据时,对数据进行预处理,把结果预存储到索引中,从而在查询时不需要再重新计算,提高查询速度。
7:高效的查询引擎:Elasticsearch使用了高效的查询引擎,支持各种类型的查询,并对复杂查询提供了优化策略,从而提高查询速度。
8:异步请求处理:ES使用了异步请求处理机制,能够在请求到达时立即返回,避免长时间的等待,提高用户体验。
9:内存存储:ES使用了内存存储技术,能够在读写数据时大大减少磁盘访问次数,提高数据存储和查询效率。
我觉得最重要就是倒排索引了:它 用于快速搜索文档中的某个词汇。
假设我们有一个原始文档:
文档ID | 文档内容 |
---|---|
Doc1 | "Elasticsearch is fast" |
Doc2 | "Redis is fast too" |
Doc3 | "Elasticsearch and Redis" |
主要分为俩个过程:
-
分词(Tokenization):
-
Doc1 → ["elasticsearch", "is", "fast"]
-
Doc2 → ["redis", "is", "fast", "too"]
-
Doc3 → ["elasticsearch", "and", "redis"]
-
-
生成词项-文档映射:
Term DocIDs (Postings List) ───────────────────────────────────── "and" → [Doc3] "elasticsearch" → [Doc1, Doc3] "fast" → [Doc1, Doc2] "is" → [Doc1, Doc2] "redis" → [Doc2, Doc3] "too" → [Doc2]
3. 倒排索引的核心组件
组件 | 作用 | 示例 |
---|---|---|
词项字典(Term Dictionary) | 存储所有唯一词项,通常用 FST(有限状态转换器) 压缩存储 | "elasticsearch", "redis" |
倒排列表(Postings List) | 记录包含该词项的文档ID及位置信息(支持快速跳表SkipList优化遍历) | Doc1:[pos1,pos2], Doc3:[pos1] |
词频(TF) | 词项在文档中的出现次数(用于相关性评分) | "fast"在Doc1中TF=1 |
文档频率(DF) | 包含该词项的文档数(用于IDF计算) | "elasti |
倒排索引的优化技术
-
压缩存储:
-
FST:压缩词项字典,减少内存占用。
-
Delta Encoding:对文档ID差值编码(如[100, 102, 105]→[100, +2, +3])。
-
-
跳表(SkipList):
-
加速倒排列表的合并操作(如
AND
查询)。
-
-
多级索引:
-
内存中保留热点词项,磁盘存全量数据。
-
二、Elasticsearch 核心技术细节
1. 分词器(Analyzer)
分词器类型 | 功能说明 | 示例 |
---|---|---|
Standard | 默认分词器,按空格/标点切分 | "Elasticsearch" → ["elasticsearch"] |
IK Analyzer | 中文分词(社区版+扩展词典) IK分词器有几种模式?
IK分词器如何拓展词条?如何停用词条?
| "华为手机" → ["华为", "手机"] |
Pinyin | 中文转拼音搜索 | "北京" → ["beijing", "bj"] |
Whitespace | 仅按空格切分 | "hello world" → ["hello", "world"] |
Keyword | 不分词,整体作为Term | "2023-08-15" → ["2023-08-15"] |
自定义分词器:
PUT /my_index {"settings": {"analysis": {"analyzer": {"my_ik": {"type": "custom","tokenizer": "ik_max_word","filter": ["lowercase"]}}}} }
2. 底层原理
-
倒排索引(Inverted Index):
-
Term → Document ID 的映射(如“手机” → [Doc1, Doc3])。
-
通过 FST(Finite State Transducer) 压缩存储,减少内存占用。
-
-
分片(Shard)机制:
-
索引自动拆分为多个分片(默认5个),分散到不同节点。
-
每个分片有1个主副本和N个从副本(通过
_settings
调整)。
-
-
近实时(NRT):
-
数据写入后默认1秒(
refresh_interval
)可被搜索,通过 translog 保证持久化。
-
3. 查询高效的原因
-
分布式计算:
-
查询并行发送到所有分片,结果聚合(Scatter-Gather模式)。
-
-
缓存优化:
-
Query Cache:缓存过滤条件结果。
-
Fielddata:文本字段启用内存缓存(慎用,易OOM)。
-
-
列式存储(Doc Values):
-
对排序、聚合字段预先构建磁盘数据结构,避免实时计算。
-
4. 增删改操作
-
写入流程:
-
请求发送到协调节点。
-
路由到对应分片的主副本。
-
写入Lucene内存Buffer和translog。
-
定期刷新(Refresh)生成新Segment(可搜索)。
-
后台合并(Merge)Segment优化存储。
-
-
删除:
-
标记文档为
deleted
,Merge时物理删除。
-
-
更新:
-
先删除旧文档,再写入新文档(版本号
_version
递增)。
-
三、关键问题解决方案
1. 深度分页优化
-
问题:
from 10000, size 10
需遍历所有分片的10010条记录。在Elasticsearch中进行分页查询通常使用from和size参数。当我们对Elasticsearch发起一个带有分页参数的查询(如使用from和size参数)时,ES需要遍历所有匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档。跟MySQL的深度分页原因差不多, -
方案:
-
Search After:search_after 是 Elasticsearch 中用于实现深度分页的一种机制。与传统的分页方法(使用 from 和 size 参数)不同,search_after 允许你基于上一次查询的结果来获取下一批数据,这在处理大量数据时特别有效。
在第一次查询时,你需要定义一个排序规则。不需要指定 search_after 参数:{"query": { "match_all": {} },"size": 10,"sort": [{"_id": "asc"}],//在第一次查询时,你需要定义一个排序规则。"search_after": [last_id] //第一次查询不要定义,在后续的查询中,使用上一次查询结果中最后一条记录的排序值 //search_after包含timestamp和last_id 的值,对应上一次查询结果的最后一条记录。}
search_after 可以有效解决深度分页问题,原因如下:
避免重复处理数据:与传统的分页方式不同,search_after 不需要处理每个分页请求中所有先前页面上的数据。这大大减少了处理数据的工作量。
提高查询效率:由于不需要重复计算和跳过大量先前页面上的数据,search_after 方法能显著提高查询效率,尤其是在访问数据集靠后部分的数据时。
但是这个方案有一些局限,一方面需要有一个全局唯一的字段用来排序,另外虽然一次分页查询时不需要处理先前页面中的数据,但实际需要依赖上一个页面中的查询结果。 -
适用于深度分页和大数据集的遍历。
-
-
-
Scroll API:Scroll API在Elasticsearch中的主要目的是为了能够遍历大量的数据,它通常用于数据导出或者进行大规模的数据分析。可以用于处理大量数据的深度分页问题。
-
POST /_search/scroll { "scroll": "1m", "scroll_id": "DXF1ZXJ5QW..." }
//如上方式初始化一个带有scroll参数的搜索请求。这个请求返回一个scroll ID,用于后续的滚动。Scroll参数指定了scroll的有效期,例如1m表示一分钟。
//接下来就可以使用返回的scroll ID来获取下一批数据。每次请求也会更新scroll ID的有效期。 -
业务妥协:限制最大页码(如只展示前100页)。
-
避免重复排序:在传统的分页方式中,每次分页请求都需要对所有匹配的数据进行排序,以确定分页的起点。Scroll避免了这种重复排序,因为它保持了一个游标。
-
稳定视图:Scroll提供了对数据的“稳定视图”。当你开始一个scroll时,Elasticsearch会保持搜索时刻的数据快照,这意味着即使数据随后被修改,返回的结果仍然是一致的。
-
减少资源消耗:
由于不需要重复排序,Scroll减少了对CPU和内存的消耗,特别是对于大数据集。 -
Scroll非常适合于处理需要访问大量数据但不需要快速响应的场景,如数据导出、备份或大规模数据分析。
但是,需要知道,使用Scroll API进行分页并不高效,因为你需要先获取所有前面页的数据。Scroll API主要用于遍历整个索引或大量数据,而不是用于快速访问特定页数的数据。
-
2. 数据一致性
第一种方法:双写一致性
对MySQL和ES进行双写,先更新数据库,再更新ES,放在一个事务里面,需要保证事务的一致性。有数据不一致的风险,比如MySQL写入成功,但是ES发生了写入成功但因为超时抛异常了就会出现数据不一致的情况。
第二种方法:使用消息队列MQ进行处理
在更新数据库时,发送一个消息到MQ中,然后数据库和ES各设置一个监听者,监听消息之后各自去做数据变更,如果失败了就基于消息的重试在重新执行。
好处是进行了异步解耦,性能稍后,但是有延迟
第三种方法:定时扫描MySQL
如果ES中的数据变更的实时性要求不高,可以考虑定时任务扫表来批量更新ES。
这个方案优点是没有侵入性,数据库的写操作处不需要改代码。
缺点是实时性很差,并且轮询可能存在性能问题、效率问题以及给数据库带来压力。
第四种方法:监听binlog日志(基于canal做数据同步的方案)
对业务代码完全没有侵入性,业务也非常解耦,不需要关心这个ES的更新操作。
缺点就是需要基于binlog监听,需要引入第三方框架。存在一定的延迟。
一致性级别 | 实现方案 | 优缺点 |
---|---|---|
强一致性 | 写入后立即refresh (性能差) | 数据最新,吞吐量下降 |
最终一致性 | 默认1秒刷新 + 手动_refresh (平衡选择) | 性能高,短暂延迟 |
与Canal集成:主要的过程
-
MySQL Binlog → Canal Server 解析变更。
-
Canal Client → Kafka 发送变更事件。
-
Logstash/自定义Consumer → 写入ES。
关于Logstash和自定义Consumer
. Logstash 是什么?
-
定位:开源的数据处理管道工具,属于 Elastic Stack(ELK)的一部分。
-
核心功能:
-
数据输入(Input):从 Kafka、MySQL、文件等读取数据。
-
数据过滤(Filter):清洗、转换、丰富数据(如字段重命名、类型转换)。
-
数据输出(Output):将处理后的数据写入 ES、MySQL、文件等。
-
-
特点:
-
配置驱动:通过配置文件定义数据处理流程,无需编码。
-
插件化:支持 200+ 官方/社区插件(如
kafka
、elasticsearch
、grok
)。
-
Canal → ES 场景中的用途
将 Canal 发送到 Kafka 的 MySQL Binlog 数据转换为 ES 所需的格式,并写入 ES。
2. 自定义 Consumer 是什么?
-
定位:用户自行编写的程序(通常用 Java/Python/Go),用于消费 Kafka 消息并处理。
-
核心功能:
-
从 Kafka 拉取 Canal 生成的 Binlog 消息。
-
解析消息并转换为 ES 支持的格式(如 JSON)。
-
调用 ES 的 API 写入数据。
-
-
特点:
-
灵活可控:可自定义业务逻辑(如特殊字段处理、错误重试)。
-
高性能:通过批量写入、异步请求等优化吞吐量。
-
整体架构流程:
3. ES支持的数据结构
-
核心类型:
-
Text:用于存储全文文本数据。
-
Keyword:用于存储文本值,通常用于索引结构化内容,如邮件地址、标签或任何需要精确匹配的内容。
-
Nested:类似于 Object 类型,但用于存储数组列表,其中列表中的每个元素都是完全独立且可搜索的。
-
Long, Integer, Short, Byte, Double, Float: 这些是数值类型,用于存储各种形式的数字。
-
Date: 存储日期或日期和时间。
-
Boolean: 存储 true 或 false 值。
-
Binary: 用于存储二进制数据。
-
Object: 用于嵌套文档,即文档内部可以包含文档。
-
-
特殊类型:
-
Flattened:避免深层JSON字段爆炸。
-
Join:父子文档(性能较差,慎用)。
-
-
text 和 keyword 有啥区别?
text 类型被设计用于全文搜索。这意味着当文本被存储为 text 类型时,Elasticsearch 会对其进行分词,把文本分解成单独的词或短语,便于搜索引擎进行全文搜索。因为 text 字段经过分词,它不适合用于排序或聚合查询。
text适用于存储需要进行全文搜索的内容,比如新闻文章、产品描述等。
keyword 类型用于精确值匹配,不进行分词处理。这意味着存储在 keyword 字段的文本会被当作一个完整不可分割的单元进行处理。因为 keyword 类型字段是作为整体存储,它们非常适合用于聚合(如计数、求和、过滤唯一值等)和排序操作。由于不进行分词,keyword 类型字段不支持全文搜索,但可以进行精确匹配查询。
keyword适用于需要进行精确搜索的场景,比如标签、ID 编号、邮箱地址等。 -
ES 不支持 decimal,如何避免丢失精度?
五种方法:
一:使用字符串类型(比较好用)
完全保留数字的精度。简单易于实现,数据迁移时不需特别处理。但是作为字符串存储的数字不能直接用于数值比较或数学运算,需要在应用层处理转换。但也不是什么大毛病。
二:扩大浮点类型的精度
就是直接使用 double 类型,在理论上可能会有精度损失,但实际上 double 类型提供的精度对于许多业务需求已经足够使用。需要接受减小精度损失。
三:使用scaled_float(推荐)
Elasticsearch 的 scaled_float 类型是一种数值数据类型,专门用于存储浮点数。其特点是通过一个缩放因子(scaling factor)将浮点数转换为整数来存储,从而在一定范围内提高存储和计算的效率。他使用一个缩放因子将浮点数转换为整数存储。例如,如果缩放因子是 100,那么值 123.45 会存储为 12345。这样可以避免浮点数存储和计算中的精度问题。
四:使用多个字段
在某些情况下,可以将 decimal 数值拆分为两个字段存储:一个为整数部分,另一个为小数部分。这样做可以在不丢失精度的情况下,将数值分开处理。可以保持数值精确,同时可进行部分数学运算。但是增加了数据处理的复杂性,需要在应用层重建数值。
五:使用自定义脚本
用 Elasticsearch 的脚本功能(如 Painless 脚本)来处理数值计算,确保在处理过程中控制精度。优点:灵活控制数据处理逻辑。缺点:可能影响查询性能,增加系统复杂性。
四、实际应用场景
1. 电商搜索
-
需求:支持颜色、品牌、价格区间等多维度过滤。
-
实现:
{"query": {"bool": {"must": [{ "term": { "brand": "华为" } },{ "range": { "price": { "gte": 1000, "lte": 2000 } } }],"filter": { "term": { "color": "红色" } }}},"aggs": {"price_stats": { "stats": { "field": "price" } }} }
2. 日志告警
-
需求:实时检测ERROR日志并触发告警。
-
实现:
-
Watcher 插件定时查询:
{"query": { "match": { "level": "ERROR" } },"condition": { "compare": { "ctx.hits.total": { "gt": 0 } } },"actions": { "email": { "to": "admin@example.com" } } }
-
3. 数据同步容灾
-
双写方案:
-
应用同时写MySQL和ES,通过本地事务表记录同步状态。
-
-
补偿机制:
-
定时任务扫描MySQL与ES差异数据,修复不一致。
-
五、性能调优
集群和硬件优化
负载均衡: 确保查询负载在集群中均衡分配。
硬件资源: 根据需要增加 CPU、内存或改善 I/O 性能(例如使用 SSD)。
配置 JVM: 优化 JVM 设置,如堆大小,以提高性能。
-
硬件:SSD磁盘、32GB+内存(堆内存不超过31GB)。
-
索引设计:
-
-
选择合适的分词器
冷热分离:hot-warm
架构(热数据用SSD,冷数据用HDD)。 -
生命周期管理(ILM):自动滚动到新索引。
-
-
查询优化:
-
避免
wildcard、
regexp查询(如*test*
)。 -
使用
constant_score
过滤不相关文档。 -
使用过滤器: 对于不需要评分的查询条件,使用 filter 而不是 query,因为 filter 可以被缓存以加快后续相同查询的速度。
-
合理使用聚合:聚合可以用于高效地进行数据分析,但复杂的聚合也可能非常消耗资源。优化聚合查询,如通过限制桶的数量,避免过度复杂的嵌套聚合。
-
查询尽可能少的字段: 只返回查询中需要的字段,减少数据传输和处理时间。
-
避免深度分页: 避免深度分页,对于需要处理大量数据的情况,考虑使用 search_after。
-
总结
-
选型:ES适合搜索/分析,MySQL适合事务/精准查询。
-
核心能力:分词器、倒排索引、分布式计算支撑高效查询。
-
一致性:通过
refresh
、Canal同步等方案平衡实时性与性能。 -
实践:结合业务场景选择分页策略、数据结构、同步机制。
相关文章:
【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?
Elasticsearch 深度解析:从原理到实践 一、为什么选择 Elasticsearch? 数据模型 Elasticsearch 是基于文档的搜索引擎,它使用 JSON 文档来存储数据。在 Elasticsearch 中,相关的数据通常存储在同一个文档中,而不是分散…...
华为云Astro大屏连接器创建操作实例:抽取物联网iotda影子设备数据的连接器创建
目录 样图(API连接器创建成功) 说明 操作场景(以Astro大屏抽取iotda影子参数为例) 实际操作步骤 新建连接器 设置基本信息。 接口鉴权方式,支持API鉴权、AK/SK、API Key和无身份验证 无身份验证 AK/SK认证(目前暂不能用) API Key认证(第三方使用) API鉴权认…...
C#泛型集合深度解析(九):掌握System.Collections.Generic的核心精髓
一、泛型集合革命:告别装箱拆箱的性能噩梦 1.1 泛型与非泛型集合性能对比 // 非泛型集合(ArrayList) ArrayList arrayList = new ArrayList(); arrayList.Add(100); // 装箱发生 int value = (int)arrayList[0]; // 拆箱发生// 泛型集合(List<T>) List<…...
人工智能-深度学习之卷积神经网络
深度学习 mlp弊端卷积神经网络图像卷积运算卷积神经网络的核心池化层实现维度缩减卷积神经网络卷积神经网络两大特点卷积运算导致的两个问题:图像填充(padding)结构组合问题经典CNN模型LeNet-5模型AlexNet模型VGG-16模型 经典的CNN模型用于新…...
《软件设计师》复习笔记(11.1)——生命周期、CMM、开发模型
目录 一、信息系统生命周期 系统规划阶段 系统分析阶段(逻辑设计) 系统设计阶段(物理设计) 系统实施阶段 系统运行与维护阶段 二、能力成熟度模型(CMM/CMMI) CMM 五级模型 CMMI 两种表示方法 真题…...
AI大模型基础设施:主流的几款开源AI大语言模型的本地部署成本
以下是对目前主流开源AI大语言模型(如DeepSeek R1、LLaMA系列、Qwen等)本地部署成本的详细分析,涵盖计算机硬件、显卡等成本,价格以美元计算。成本估算基于模型参数规模、硬件需求(GPU、CPU、RAM、存储等)以…...
Narendra自适应控制器设计
上一篇介绍了在系统结构中引入前馈和反馈的结构,然后利用李雅普诺夫稳定性理论设计MRACS,在基于输入输出形式中,利用李雅普诺夫稳定性设计的自适应率中包含了误差的导数,这降低了系统的抗干扰性,为了避免这一缺点&…...
为什么大模型偏爱Markdown
Markdown 的简洁之美 我们常见的文档格式,比如HTML、JSON、XML或者Markdown,Markdown是最简洁的。 比如要展示一行标题,相比复杂的HTML标签,使用Markdown我们只需要在文本前加个井号: <heading level“1”>这是…...
【kafka系列】消费者组
目录 消费者组功能点 1. 动态负载均衡 2. 容错高可用 3. 消费进度管理 4. 并行消费能力 5. 消费隔离性 其他要点 1. Rebalance过程详解 2. 位移提交的精确语义 3. 消费者限速策略 4. 跨机房消费设计 消费者组功能点 1. 动态负载均衡 核心机制:通过Rebal…...
2025五一杯数学建模C题:社交媒体平台用户分析问题;思路分析+模型代码
(一)问题背景 想象一下,社交媒体平台是一个充满活力的生态系统,博主们如同才华横溢的创作者,凭借专业知识或独特兴趣,精心打造出各种高质量内容,吸引着众多用户的目光。用户则像热情的参与者&a…...
Kotlin-运算符重载函数
在 Kotlin 里,运算符重载函数允许为自定义类型重新定义现有的运算符(如 -…)行为,从而让自定义类型能像内置类型那样使用运算符 文章目录 基本语法作用场景类对象数据类型接口 注意事项 基本语法 若要重载运算符,需要定义一个带有 operato…...
哈希表笔记(三)Java Hashmap
一、基本介绍 HashMap 是 Java 集合框架中的核心类之一,基于哈希表实现,提供了 Map 接口的主要实现。 1.1 主要特点 实现了 Map<K,V> 接口允许 null 键和 null 值(不同于 Hashtable)非同步实现(非线程安全&am…...
2025五一杯C题五一杯数学建模思路代码文章教学:社交媒体平台用户分析问题
完整内容请看文章最下面的推广群 问题一详细分析:逐步思考与建模过程 第1步:问题理解与数学建模目标明确 目标明确: 平台希望根据2024年7月11日至7月20日的用户与博主交互数据,预测2024年7月21日各博主新增的关 注数,…...
2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)
2025年五一数学建模竞赛B题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.…...
[蓝桥杯 2021 省 AB] 砝码称重 Java
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] w new int[n 1];int sum 0; // 所有砝码重量之和for (int i 1; i < n; i) {w[i] sc.nextInt();sum w[i];}sc.close()…...
Linux 命令如何同时支持文件参数与管道输入?
文章目录 Linux 命令如何同时支持文件参数与管道输入?命令输入方式与管道机制概述常见输入控制方式常见使用示例程序实现思路:统一处理输入的方式判定输入来源的基本模式为何命令应支持参数与标准输入? GNU Coreutils wc 源码解析:…...
Lucene多种数据类型使用说明
Lucene 作为一款高性能的全文检索引擎库,其核心功能围绕索引和搜索文本数据,但它也支持多种数据类型以满足复杂的应用场景。以下是 Lucene 支持的主要数据类型及其用途的详细说明: 1. 文本类型(Text) 用途:…...
使用CubeMX新建DMA工程——存储器到外设模式
目录 1、新建板级支持包 1、usart.c: 2、修改的地方:在usart.c中添加了这些 3、usart.h: 4、在usart.h中添加了这些: 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加头文件 2、添加外部变量声明 3、添加简单延时函数 4、添加…...
基于Redis实现-附近商铺查询
基于Redis实现-附近查询 这个功能将使用到Redis中的GEO这种数据结构来实现。 1.GEO相关命令 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入到了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据&#…...
【Redis】Another Redis Desktop Manager 安装指南
目录 一、Another Redis Desktop Manager 介绍 二、下载安装指南 三、效果预览 一、Another Redis Desktop Manager 介绍 国人开发的更快、更好、更稳定的 Redis 桌面客户端工具,功能强大,支持集群、哨兵、SSL 认证、 树状视图、自定义格式化脚本等功…...
装饰器设计模式(Decorator Pattern)详解
装饰器设计模式(Decorator Pattern)详解 装饰器模式是一种结构型设计模式,它允许动态地向对象添加额外行为,而无需修改其原始类。这种模式通过包装对象的方式提供灵活的扩展功能替代继承。 1. 核心概念 (1)模式定义 装饰器模式:动态地给一个对象添加一些额外的职责,就…...
LiteOS与SLE透传实战案例
文章目录 硬件设计EDA 软件介绍创建元件及封装原理图绘制Layout元件焊接 软件设计LiteOS 入门核心概念TaskWorkflow参考 API(参考 osal_task. h) 时间片任务轮转练习:仿写 example/peripheral/blinkyQueue参考 API(参考 osal_msgq…...
MCAL学习(1)——AutoSAR
1.了解AutoSAR及一些概念 AutoSAR是Automotive Open System Architecture ,汽车开放系统架构。 针对汽车ECU的软件开发架构。已经是汽车电子软件开发的标准。 OS服务:Freertos 整车厂(OEM)主要负责应用层算法 一级供应商:生产制…...
前端vue3项目学习
鸽王经过一个多月的学习(断断续续吧,毕竟还有其他杂事),学的昏天黑地,终于把主线捋的差不多了。只能说,前端真不是人学的,涉及的语言语法太杂乱了,入门真的太难了。而后端࿰…...
ActiveMQ 性能优化与网络配置实战(二)
五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中,增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息,可以充分利用系统资源,加快消息的消费速度,从而提高系统的整体吞…...
Python 函数装饰器和闭包(装饰器基础知识)
本章内容: Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后,我们可以进一步探讨装饰器: 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...
“Everything“工具 是 Windows 上文件名搜索引擎神奇
01 Everything 和其他搜索引擎有何不同 轻量安装文件。 干净简洁的用户界面。 快速文件索引。 快速搜索。 快速启动。 最小资源使用。 轻量数据库。 实时更新。 官网:https://www.voidtools.com/zh-cn/downloads/ 通过网盘分享的文件:Every…...
【Machine Learning Q and AI 读书笔记】- 04 彩票假设
Machine Learning Q and AI 中文译名 大模型技术30讲,主要总结了大模型相关的技术要点,结合学术和工程化,对LLM从业者来说,是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第4篇,对应原…...
linux下安装ollama网不好怎么办?
文章目录 前言kkgithub下载脚本,而不是直接运行修改脚本修改权限还是不行?前言 今天想在linux上面更新一下ollama,于是去到官网: https://ollama.com/download/linux linux下安装ollama还是挺简单的: curl -fsSL https://ollama.com/install.sh | sh我也是特别嗨皮地就…...
(A题|支路车流量推测问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...
RDMA高性能网络通信实践
RDMA高性能网络通信实践 一、背景介绍二、方法设计A.实现方案B.关键技术点三、代码及注释四、注意事项一、背景介绍 远程直接内存访问(RDMA)技术通过绕过操作系统内核和CPU直接访问远程内存,实现了超低延迟、高吞吐量的网络通信。该技术广泛应用于高性能计算、分布式存储和…...
【LeetCode Hot100】图论篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 200. 岛屿数量 一句话题意 求所有上下左右的‘1’的连通块…...
图论---有向图的强连通分量(Tarjan求SCC)
强连通分量作用:有向图——>(缩点)有向无环图(DAG) 缩点:将所有连通的分量缩成一个点。 有向无环图作用/好处:求最短路/最长路 可以递推,按照拓扑图从前往后递推. x 是否在某个…...
2025年- H17-Lc125-73.矩阵置零(矩阵)---java版
1.题目描述 2.思路 (1)计算矩阵的行数 (2)计算矩阵的列数 (3)设计一个行列的bool数组 (4)遍历矩阵(二维数组),如果遇到元素0,则把…...
【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题(第一批):论信息系统项目的干系人管理1、写作要点2、解题思路项目干系人管理的过程和执行要点项目中所有干系人如何进行分类管理?试题(第二批):论信息系统项目的工作绩效域1、写作要点2、解题思路绩…...
分享5款开源、美观的 WinForm UI 控件库
前言 今天大姚给大家分享5款开源、美观的 WinForm UI 控件库,助力让我们的 WinForm 应用更好看。 WinForm WinForm是一个传统的桌面应用程序框架,它基于 Windows 操作系统的原生控件和窗体。通过简单易用的 API,开发者可以快速构建基于窗体…...
微软推出数款Phi 4“开放式”人工智能模型
微软周三推出了几款新的“开放式”人工智能模型,其中功能最强大的模型至少在一个基准测试上可与 OpenAI 的 o3-mini 相媲美。所有新的授权模型——Phi 4 mini reasoning、Phi 4 reasoning 和 Phi 4 reasoning plus——都是“推理”模型,这意味着它们能够…...
Python实例题:Python实现Python解释器
目录 Python实例题 题目 实现思路 代码实现 代码解释 词法分析器(Lexer): 词法单元类(Token): 抽象语法树节点类(AST): 语法分析器(Parserÿ…...
【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南
🌟 图像滤波魔法指南 🎨 在图像处理的世界里,滤波就像是给图片"美颜"的魔法工具。让我们一起来探索这些神奇的滤波术吧! 📑 目录 1. 均值滤波:图像的"磨皮"大法2. 中值滤波࿱…...
信息系统项目管理师-软考高级(软考高项)2025最新(六)
个人笔记整理---仅供参考 第六章项目管理概论 6.1PMBOK的发展 6.2项目基本要素 组织过程资产指的是项目上的,国产数据库的使用----安保和安全指的是环境因素 6.3项目经理的角色 6.4价值驱动的项目管理知识体系...
算法-堆、排序算法、矩阵乘法
满二叉树、完全二叉树 二叉树遵循下面的规律,当前节点i(但是其实就是逐级填充): 左节点为 ix2右节点为 i*21父节点为 [i/2] 向下取整 使用数组表示二叉树: (二叉树的深度自上而下,高度自下…...
Java 进阶--集合:告别数组的“僵硬”,拥抱灵活的数据容器
作者:IvanCodes 发布时间:2025年5月1日🫡 专栏:Java教程 大家好!👋 还记得我们上次聊的数组 (Array) 吗?它很基础,性能也不错,但有个致命的缺点:长度一旦定…...
Python 数据智能实战 (6):用户评论深度挖掘
写在前面 —— 从繁杂评论到精准洞察:主题发现与情感趋势分析,驱动产品优化与体验提升 在上篇内容中,我们学习了如何利用 LLM 提升用户分群的精度,以及如何超越传统购物篮分析,挖掘商品间的语义关联。今天,我们将聚焦于电商领域 价值密度最高 的非结构化数据之一——用…...
podman/docker国内可用的docker镜像源(2025-05)
一、添加Docker国内镜像 1、修改 /etc/docker/daemon.json 设置 registry mirror,具体命令如下: sudo vim /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me",&q…...
机器人--底盘
机器人底盘 底盘是机器人传感器和机器人主机的载体,也是移动机器人的基本形式。移动机器人通常可以采用轮式和足式进行移动。 也就是机器人底盘可以分为轮式底盘和足式底盘。 足式底盘控制复杂,这里只讨论轮式底盘。 底盘运动学模型 轮式机器人底盘按…...
Seata服务端同步提交事务核心源码解析
文章目录 前言一、doGlobalCommit(同步提交)2.1、closeAndClean()2.2、changeGlobalStatus2.3、doGlobalCommit2.3.1、findGlobalSession 总结 前言 本篇介绍Seata服务端TC如何驱动RM提交事务。 一、doGlobalCommit(同步提交) doG…...
2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题
完整内容请看文章最下面的推广群 问题1. 根据附件1中的数据和,建立数学模型,对数据A进行某种变换,使得变换后的结果与数据尽可能接近。计算变换后的结果与数据的误差,并分析误差的来源(如数据噪声、模型偏差等…...
C++11新特性_自动类型推导
decltype 和 auto 均为 C 里用于类型推导的关键字,不过它们在使用方式、推导规则和应用场景上存在显著差异。下面为你详细介绍它们的区别: 1. 推导依据 auto:它依据变量的初始化表达式来推导类型。也就是说,auto 定义的变量必须有…...
【AI论文】ReasonIR:为推理任务训练检索器
摘要:我们提出了ReasonIR-8B,这是第一个专门针对一般推理任务进行训练的检索器。 现有的检索器在推理任务上表现出的收益有限,部分原因是现有的训练数据集侧重于与直接回答它们的文档相关的简短事实查询。 我们开发了一个合成数据生成管道&am…...
嵌入式AI还是一片蓝海
发现其实还是挺多人关注嵌入式和人工智能交叉领域的,随便一个问题,浏览量就27万了,但是这方面的内容确实少得可怜……所以干脆我自己来补点干货。 推荐一本最近很热门的新书——《边缘人工智能:用嵌入式机器学习解决现实问题》。 …...