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

Elasticsearch:从入门到生产落地

一、什么是 Elasticsearch为什么我们需要它Elasticsearch简称 ES是一个开源的、分布式的、RESTful 风格的搜索引擎和数据分析引擎。它基于 Lucene 库构建提供了简单易用的 API隐藏了 Lucene 的复杂性。ES 的核心特点分布式自动分片、自动负载均衡、自动故障转移近实时数据写入后 1 秒内即可被搜索到全文检索支持复杂的全文搜索、模糊搜索、高亮显示数据分析支持强大的聚合查询能快速进行数据统计和分析高可用支持主从复制单个节点故障不影响服务可扩展可以轻松扩展到上百个节点处理 PB 级别的数据为什么不用 MySQL 做搜索很多人会问MySQL 也有 like 查询为什么还要用 ES答案很简单MySQL 的 like 查询在大数据量下性能极差而且不支持全文检索和复杂的数据分析。MySQL 的 like % 关键词 % 查询会走全表扫描百万级数据就会明显变慢MySQL 不支持分词只能做简单的字符串匹配MySQL 不支持复杂的相关性排序MySQL 不支持聚合分析和统计而 ES 就是为了解决这些问题而生的。它专门针对搜索和分析进行了优化能在毫秒级返回千万级数据的查询结果。二、ES 的核心应用场景ES 的应用场景非常广泛我总结了最常用的 8 个场景全文检索商品搜索、文章搜索、用户搜索日志分析ELKElasticsearchLogstashKibana日志收集分析系统指标监控系统指标、业务指标的实时监控和告警数据分析用户行为分析、销售数据分析、运营数据分析地理信息搜索附近的人、附近的商家、地理位置查询自动补全搜索框的输入提示、自动补全功能拼写纠错搜索时的拼写检查和纠错数据可视化配合 Kibana 制作各种数据仪表盘三、ES 的核心概念要真正用好 ES必须先搞懂它的核心概念。很多人学 ES 觉得难就是因为这些概念和关系型数据库不一样。我做了一个 ES 和 MySQL 的概念对比表帮助你快速理解表格ElasticsearchMySQLIndex索引Database数据库Document文档Row行Field字段Column列Mapping映射Table Schema表结构Query DSLSQLShard分片分表Replica副本主从复制核心概念详解Index索引ES 中存储数据的地方相当于 MySQL 的数据库。一个索引就是一个逻辑上的数据集合。Document文档ES 中的最小数据单元相当于 MySQL 的一行记录。文档以 JSON 格式存储。Field字段文档中的属性相当于 MySQL 的列。每个字段都有自己的数据类型。Mapping映射定义索引中字段的数据类型、分词器、索引方式等相当于 MySQL 的表结构。Shard分片将一个大的索引分成多个小的分片分布在不同的节点上实现水平扩展。Replica副本分片的备份用于提高数据的可用性和查询性能。四、Spring Boot 集成 ES 完整教程下面我以 Spring Boot 2.7.x 为例教你如何快速集成和使用 Elasticsearch。第一步引入依赖xmldependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-elasticsearch/artifactId /dependency第二步配置 ES 连接yamlspring: elasticsearch: rest: uris: http://localhost:9200 username: elastic password: 123456 connection-timeout: 5s read-timeout: 30s第三步定义实体类和 Mappingjava运行Data Document(indexName product, shards 3, replicas 1) public class Product { Id private Long id; Field(type FieldType.Text, analyzer ik_max_word) private String name; Field(type FieldType.Text, analyzer ik_max_word) private String description; Field(type FieldType.Double) private Double price; Field(type FieldType.Integer) private Integer stock; Field(type FieldType.Keyword) private String category; Field(type FieldType.Date, format DateFormat.date_time) private Date createTime; }第四步定义 Repository 接口java运行public interface ProductRepository extends ElasticsearchRepositoryProduct, Long { // 根据名称搜索 ListProduct findByName(String name); // 根据名称和描述搜索 ListProduct findByNameOrDescription(String name, String description); // 根据价格区间查询 ListProduct findByPriceBetween(Double minPrice, Double maxPrice); }第五步使用 Repository 操作 ESjava运行Service public class ProductService { Autowired private ProductRepository productRepository; // 保存商品 public void saveProduct(Product product) { productRepository.save(product); } // 根据ID查询 public Product findById(Long id) { return productRepository.findById(id).orElse(null); } // 搜索商品 public ListProduct search(String keyword) { return productRepository.findByNameOrDescription(keyword, keyword); } // 删除商品 public void deleteById(Long id) { productRepository.deleteById(id); } }第六步复杂查询Query DSL对于复杂的查询我们需要使用 ElasticsearchRestTemplate 来编写 Query DSLjava运行Service public class ProductSearchService { Autowired private ElasticsearchRestTemplate elasticsearchTemplate; public PageProduct searchProducts(String keyword, String category, Double minPrice, Double maxPrice, int pageNum, int pageSize) { NativeSearchQueryBuilder queryBuilder new NativeSearchQueryBuilder(); // 构建查询条件 BoolQueryBuilder boolQuery QueryBuilders.boolQuery(); // 关键词搜索 if (StringUtils.hasText(keyword)) { boolQuery.must(QueryBuilders.multiMatchQuery(keyword, name, description) .type(MultiMatchQueryBuilder.Type.BEST_FIELDS) .boost(3.0f)); } // 分类过滤 if (StringUtils.hasText(category)) { boolQuery.filter(QueryBuilders.termQuery(category, category)); } // 价格区间过滤 if (minPrice ! null maxPrice ! null) { boolQuery.filter(QueryBuilders.rangeQuery(price).gte(minPrice).lte(maxPrice)); } queryBuilder.withQuery(boolQuery); // 排序按价格升序 queryBuilder.withSort(SortBuilders.fieldSort(price).order(SortOrder.ASC)); // 分页 queryBuilder.withPageable(PageRequest.of(pageNum - 1, pageSize)); // 高亮显示 HighlightBuilder highlightBuilder new HighlightBuilder(); highlightBuilder.field(name).field(description); highlightBuilder.preTags(em stylecolor:red); highlightBuilder.postTags(/em); queryBuilder.withHighlightBuilder(highlightBuilder); // 执行查询 SearchHitsProduct searchHits elasticsearchTemplate.search( queryBuilder.build(), Product.class); // 处理高亮结果 ListProduct products searchHits.stream().map(hit - { Product product hit.getContent(); // 替换高亮字段 if (hit.getHighlightFields().containsKey(name)) { product.setName(hit.getHighlightFields().get(name).get(0)); } if (hit.getHighlightFields().containsKey(description)) { product.setDescription(hit.getHighlightFields().get(description).get(0)); } return product; }).collect(Collectors.toList()); return new PageImpl(products, PageRequest.of(pageNum - 1, pageSize), searchHits.getTotalHits()); } }五、深入原理ES 为什么这么快ES 的高性能是由多个关键技术共同决定的1. 倒排索引这是 ES 最核心的数据结构。和关系型数据库的正排索引不同倒排索引记录的是 关键词 - 文档 的映射关系。举个例子文档 1我爱 Java文档 2我爱 Elasticsearch文档 3Java 是最好的编程语言倒排索引就是plaintext我 → [1, 2] 爱 → [1, 2] Java → [1, 3] Elasticsearch → [2] 是 → [3] 最好的 → [3] 编程语言 → [3]当你搜索 Java 时ES 直接从倒排索引中找到包含 Java 的文档 1 和 3速度非常快。2. 分词器ES 会将文本内容拆分成一个个关键词然后建立倒排索引。分词器的质量直接决定了搜索结果的准确性。ES 内置了多种分词器最常用的中文分词器是 IK 分词器它支持细粒度分词ik_max_word和粗粒度分词ik_smart两种模式。3. 分布式架构ES 天生就是分布式的它将数据分成多个分片分布在不同的节点上。查询时可以并行查询多个分片然后合并结果大大提高了查询速度。4. 内存缓存ES 将热点数据和索引缓存到内存中查询时直接从内存获取避免了磁盘 IO。六、ES 常见问题与解决方案在生产环境中使用 ES最常见的问题有问题 1深分页问题问题描述当使用 fromsize 进行分页时from 越大查询越慢。当 from 超过 10000 时ES 会直接报错。原因ES 需要从所有分片中查询前 fromsize 条数据然后在协调节点进行排序和合并最后返回 size 条数据。from 越大这个过程越耗时。解决方案使用 search_after适用于滚动加载场景不支持跳页使用 scroll适用于批量导出数据不适用于用户交互限制分页深度业务上限制用户只能翻到前 100 页问题 2索引设计不当导致查询慢常见错误给不需要搜索的字段设置为 text 类型使用默认的分词器处理中文索引分片数设置不合理没有设置合理的刷新间隔解决方案只给需要搜索的字段设置为 text 类型其他字段设置为 keyword 或数值类型使用 IK 分词器处理中文分片数设置为节点数的 1-3 倍单个分片大小控制在 10-50GB将刷新间隔refresh_interval设置为 30s 或更长提高写入性能问题 3数据写入慢问题描述大量数据写入时ES 性能下降严重。解决方案使用批量写入bulk API每次批量写入 1000-5000 条数据关闭自动刷新写入完成后再手动刷新增加副本数为 0写入完成后再恢复副本使用 SSD 磁盘调整 JVM 堆内存大小设置为物理内存的一半不超过 32GB问题 4集群健康状态异常常见状态Green所有主分片和副本都正常运行Yellow所有主分片正常运行部分副本不正常Red部分主分片不正常解决方案Yellow 状态检查节点是否正常增加节点数Red 状态检查故障节点恢复数据必要时重建索引七、ES 生产环境最佳实践最后我分享几个我在生产环境中总结的 ES 最佳实践版本选择建议使用 7.x 版本不要使用太新或太旧的版本集群规划至少 3 个节点避免脑裂问题硬件配置使用 SSD 磁盘内存越大越好CPU 核心数不少于 4 核索引设计索引名使用小写字母用下划线分隔不要在一个索引中存储太多不同类型的数据按时间分索引比如每天一个索引方便管理和删除查询优化避免使用通配符开头的查询避免查询大量数据使用 filter 代替 query 进行过滤filter 会缓存结果只返回需要的字段不要返回整个文档安全配置开启身份认证和权限控制禁止外网直接访问 ES 集群监控告警监控集群健康状态、节点状态、索引大小、查询延迟等指标备份恢复定期备份数据防止数据丢失

相关文章:

Elasticsearch:从入门到生产落地

一、什么是 Elasticsearch?为什么我们需要它?Elasticsearch(简称 ES)是一个开源的、分布式的、RESTful 风格的搜索引擎和数据分析引擎。它基于 Lucene 库构建,提供了简单易用的 API,隐藏了 Lucene 的复杂性…...

Claude Code每日更新速览(v2.1.114)-2026/04/20

本文前言:ClaudeCode最新版本v2.1.113/114带来多项重要更新:1.安全方面强化沙箱控制,新增域名黑名单功能,修复高危漏洞如Bash命令绕过问题;2.交互体验优化终端URL显示、多行编辑快捷键,改进全屏模式操作&am…...

0011.盛水最多的容器

题目链接 11. 盛最多水的容器 - 力扣(LeetCode) 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多…...

3分钟永久激活Windows和Office:KMS_VL_ALL_AIO智能脚本终极指南

3分钟永久激活Windows和Office:KMS_VL_ALL_AIO智能脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼?Office突然变成只读模式让你束…...

YOLOFuse功能体验:多种融合策略,满足不同精度需求

YOLOFuse功能体验:多种融合策略,满足不同精度需求 1. 多模态目标检测的价值与挑战 在智能安防和自动驾驶领域,单一传感器已经难以满足全天候、全场景的检测需求。传统RGB摄像头在低光照、烟雾、雨雪等复杂环境下表现不佳,而红外…...

jQuery 遍历 - 祖先

jQuery 遍历 - 祖先元素 (Ancestors) 在 jQuery 中,祖先遍历用于从当前选中的元素向上查找其父级、祖父级等所有祖先元素。这对于动态定位、样式修改或数据获取非常有用。 一、核心方法 1. parent() - 获取直接父元素 只返回一级父元素。 // 语法 $(selector).paren…...

前端交互性能优化实例

前端交互性能优化实例解析 在当今快节奏的互联网时代,用户体验直接影响产品的成败。前端交互性能优化是提升用户体验的关键,尤其在移动端和复杂Web应用中更为重要。本文将通过几个实际案例,介绍如何通过优化前端交互性能,减少卡顿…...

jQuery 遍历 - 后代

jQuery 遍历 - 后代元素 (Descendants) 在 jQuery 中,后代遍历用于从当前选中的元素向下查找其子元素、孙元素等所有后代节点。这是 DOM 操作中最常用的功能之一。 一、核心方法 1. children() - 获取直接子元素 只返回一级子元素(直接后代)&…...

Linux服务器新手入门:不懂命令行也能管理服务器的完整指南

Linux服务器新手入门:不懂命令行也能管理服务器的完整指南 快速安装小皮面板(一键脚本) if [ -f /usr/bin/curl ];then curl -O https://dl.xp.cn/dl/xp/install.sh;else wget -O install.sh https://dl.xp.cn/dl/xp/install.sh;fi;bash in…...

一篇吃透:Python 数据清洗与预处理企业级实战

📝 本章学习目标:本章聚焦企业数据智能处理,帮助读者掌握Python AI 协同的数据清洗与预处理全流程。通过本章学习,你将能独立完成从脏数据诊断、智能清洗、特征预处理到企业级落地的完整工作,适配数据分析、机器学习、…...

RAG检索增强生成:让大模型拥有最新知识

什么是RAG RAG(Retrieval-Augmented Generation) 即检索增强生成技术,是一种将信息检索系统与大规模语言模型相结合的技术框架。其核心思想是在生成回答之前,先从外部知识库中检索相关信息,然后将这些信息作为上下文提…...

终极Degrees of Lewdity中文汉化配置指南:3步快速解决游戏语言障碍

终极Degrees of Lewdity中文汉化配置指南:3步快速解决游戏语言障碍 【免费下载链接】Degrees-of-Lewdity-Chinese-Localization Degrees of Lewdity 游戏的授权中文社区本地化版本 项目地址: https://gitcode.com/gh_mirrors/de/Degrees-of-Lewdity-Chinese-Local…...

ESP32-S3 SPI屏幕性能优化实战:如何将LVGL帧率从卡顿提升到23FPS

ESP32-S3 SPI屏幕性能优化实战:如何将LVGL帧率从卡顿提升到23FPS 当你在ESP32-S3上成功移植LVGL并看到第一个界面时,那种成就感无与伦比。但很快,现实会给你当头一棒——动画卡顿、界面迟滞,用户体验直线下降。这不是LVGL的问题&a…...

魔兽争霸III优化终极指南:免费开源插件WarcraftHelper完全配置教程

魔兽争霸III优化终极指南:免费开源插件WarcraftHelper完全配置教程 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III…...

因漏洞数量激增,NIST 已停止对低优先级漏洞的评分

聚焦源代码安全,网罗国内外最新资讯!编译:代码卫士由于漏洞提交量不断增加导致工作量日益增长,美国国家标准与技术研究院 (NIST) 上周宣布从2026年4月15日起,停止为优先级较低的安全漏洞分配严重性评分。自4月15日起&a…...

3、IoT物理极限架构最佳实践:一文讲透端边双主(可分可合,非传统高可用)

核心概念:端边双主、非对称双主、物理极限、物理约束IoT物理极限架构思想前提是:物理极限,物理约束,而最佳实践准则是:非对称端边双主,轻量云赋能,个体自治(端、边、云),降级服务&am…...

解锁BilibiliDown的5大隐藏功能:从基础下载到批量管理的完整探索指南

解锁BilibiliDown的5大隐藏功能:从基础下载到批量管理的完整探索指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.co…...

Spring Cloud Eureka停更后,我们团队是如何平滑迁移到Nacos的(附完整配置对比)

Spring Cloud Eureka停更后,我们团队是如何平滑迁移到Nacos的(附完整配置对比) 当Netflix宣布Eureka进入维护模式时,我们团队正在使用Spring Cloud Netflix构建的微服务架构已经稳定运行了两年多。面对这个突如其来的变化&#x…...

西门子S7-1500暖通空调冷水机组PLC程序案例, 硬件采用西门子1500CPU+ET200...

西门子S7-1500暖通空调冷水机组PLC程序案例, 硬件采用西门子1500CPUET200SP接口IO模块,HMI采用西门子触摸屏 程序采用SCL控制程序编程,系统水泵采用一用一备,通过程序实现了加减机控制,根据压差控制开启的水泵台数以及…...

Vite现代化的前端构建工具详解

文章目录Vite 是什么?Vite 与 Node 的关系Vite 的核心特性1. 极快的冷启动2. 按需编译3. 预构建依赖4. 热模块替换(HMR)5. 生产打包使用 RollupVite 的工作原理开发环境生产构建Vite 的典型使用场景与 Webpack 等传统工具的对比如何在 Node 中…...

QQ空间说说备份神器:GetQzonehistory完整使用指南

QQ空间说说备份神器:GetQzonehistory完整使用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的记忆常常散落在各种社交平台中,Q…...

适合放在简历上的开源项目与练手项目Idea清单

在竞争激烈的求职市场中,一份亮眼的简历往往能让你脱颖而出。而开源项目和练手项目正是展示你技术实力和实践经验的重要砝码。无论是参与知名开源项目,还是自主开发练手项目,都能体现你的编程能力、解决问题的思维以及对技术的热情。本文将为…...

从Date到LocalDateTime:一次搞懂Java 8日期API的升级逻辑与实战迁移

从Date到LocalDateTime:Java 8日期API的全面迁移指南 当你在一个遗留的Java项目中看到java.util.Date的身影时,是否曾为它的时区问题头疼不已?或是被它的可变性设计坑过多次?Java 8引入的全新日期时间API正是为了解决这些历史包袱…...

保姆级教程:用STM32和飞特STS3215舵机做个机械臂关节(附完整代码与协议解析)

从零构建STM32机械臂关节:飞特STS3215舵机深度开发指南 在机器人开发领域,舵机控制是构建可动关节的核心技术。飞特STS3215作为一款支持360连续旋转的高性能数字舵机,其精确的位置控制和丰富的参数配置功能,使其成为DIY机械臂项目…...

鸿蒙市场份额飙升但国产厂商仍观望,生态差距与商业考量成阻碍

鸿蒙高歌猛进,国产厂商却为何冷眼旁观?鸿蒙系统在国内市场成绩斐然,市场份额突破18%,稳居国内第二。纯血鸿蒙设备数量在短短四个月内从2300万台激增至5100多万台,增速惊人。截至2026年3月,鸿蒙原生应用和元…...

【MATLAB源码-第422期】基于MATLAB的5G NR LDPC码的误码率复杂度仿真,对比BP,LBP,NMS。

操作环境:MATLAB 2024a1、算法描述摘要低密度奇偶校验码因其接近香农极限的纠错能力、良好的并行处理特性以及较强的速率兼容能力,已经成为新一代移动通信系统中共享信道的重要编码方案。5G NR标准围绕LDPC码给出了基图选择、提升因子构造、穿孔与速率匹…...

HunterPie终极指南:怪物猎人世界最强叠加层工具完整使用教程

HunterPie终极指南:怪物猎人世界最强叠加层工具完整使用教程 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/Hunter…...

谷歌监控-从Linux延申到MySQL - 详解

从Linux到MySQL:构建面向实战的四层漏斗监控体系 引言:为什么监控需要“漏斗式”思维 2025年,Gartner在《Monitoring and Observability Hype Cycle》中指出,随着数字化基础设施复杂度不断提升,单纯的“监控”已远远不…...

空洞骑士模组管理革命:Lumafly如何让300+模组一键安装告别复杂配置

空洞骑士模组管理革命:Lumafly如何让300模组一键安装告别复杂配置 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 你是否曾为《空洞骑士》模组安装的…...

别再只玩点灯了!用ESP32+MQTT打造可商用的智能花盆原型,聊聊物联网产品开发流程

从DIY到商用原型:基于ESP32的智能花盆开发全流程解析 当你的窗台绿植开始通过MQTT协议向你汇报土壤湿度时,物联网的魅力才真正显现。这不是科幻电影里的场景,而是每个开发者都能实现的智能硬件项目。本文将带你超越简单的点灯实验&#xff0c…...