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

Elasticsearch实战:从索引设计到性能优化的完整指南

Elasticsearch实战:从索引设计到性能优化的完整指南

大家好,我是迪哥。Elasticsearch 是我们系统的核心搜索组件,从商品搜索到日志分析,从全文检索到聚合分析,它无处不在。今天就聊聊 ES 的索引设计和性能优化经验。

索引设计

分片与副本

{ "settings": { "number_of_shards": 5, "number_of_replicas": 2 } }

映射设计

{ "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "price": { "type": "float" }, "create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "tags": { "type": "keyword" } } } }

分词器选择

分词器适用场景特点
standard英文按单词分词
ik_max_word中文细粒度分词
ik_smart中文粗粒度分词
pinyin拼音搜索支持拼音查询

查询优化

避免全表扫描

// ❌ 全表扫描 SearchRequest request = new SearchRequest("orders"); SearchSourceBuilder source = new SearchSourceBuilder(); source.query(QueryBuilders.matchAllQuery()); // ✅ 范围查询 source.query(QueryBuilders.rangeQuery("create_time") .gte("2024-01-01") .lte("2024-01-31"));

使用布尔查询

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "手机")) .filter(QueryBuilders.rangeQuery("price").lte(5000)) .mustNot(QueryBuilders.termQuery("status", "DELETED"));

聚合查询优化

// 使用分片聚合 TermsAggregationBuilder aggregation = AggregationBuilders .terms("by_category") .field("category") .shardSize(100); // 提前终止 aggregation.size(10);

写入优化

Bulk API

BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new IndexRequest("orders").id("1").source(document1)); bulkRequest.add(new IndexRequest("orders").id("2").source(document2)); bulkRequest.add(new IndexRequest("orders").id("3").source(document3)); BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);

刷新策略

IndexRequest request = new IndexRequest("orders") .id("1") .source(document) .setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);

禁用副本写入

// 初始化时禁用副本,写入完成后恢复 client.indices().putSettings( new PutSettingsRequest("orders") .put("number_of_replicas", 0), RequestOptions.DEFAULT );

性能调优

JVM 调优

# jvm.options -Xms8g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200

索引优化

{ "settings": { "index": { "refresh_interval": "30s", "number_of_replicas": 1, "translog": { "durability": "async", "sync_interval": "5s" } } } }

查询缓存

// 启用分片查询缓存 client.indices().putSettings( new PutSettingsRequest("orders") .put("index.queries.cache.enabled", true), RequestOptions.DEFAULT );

常见问题

问题 1:查询慢

原因:全表扫描、缺少索引、分片数不合理

解决方案

  • 添加合适的索引
  • 优化查询语句
  • 调整分片数

问题 2:写入慢

原因:副本过多、刷新频繁、bulk 大小不合理

解决方案

  • 减少副本数
  • 增大 refresh_interval
  • 调整 bulk 大小

问题 3:内存溢出

原因:JVM 堆内存不足、查询结果过大

解决方案

  • 增大堆内存
  • 使用滚动查询
  • 设置查询大小限制

说到搜索,我家那只叫 Docker 的哈士奇最近学会了"全文搜索"——不管我把零食藏在哪里,它都能精准找到,这搜索能力比我们的 ES 还强 😂

我是迪哥,我们下期再见!

http://www.jsqmd.com/news/800848/

相关文章:

  • 医学应用“药物研发“高价值专利案例:基于图神经网络的药物性质预测方法
  • 3分钟搞定B站视频转文字:从零到精通的实战指南
  • 别再死记硬背了!用Python+NumPy可视化理解OFDM与SC-FDMA的核心差异
  • 2012汽车电子技术趋势:车联网、材料革新与高性能控制设计
  • 微型环境传感器技术:PM2.5与VOC检测的突破与应用
  • Flutter 轻量存储方案介绍、区别、对比和使用场景
  • 面试官:5年经验还不懂箭头函数?
  • 基于SpatiaLite与React的英国邮编空间搜索应用架构与实战
  • Windows 环境下 Claude Code 安装与配置完全指南(含国产模型切换)
  • OpenClaw 长期使用避坑指南:环境稳定性维护、数据备份策略、版本兼容处理全方案
  • Windows 11安卓子系统WSA终极指南:开发者问题与功能请求完整解析
  • Intelli开源智能代理框架:从核心概念到生产部署全解析
  • 仅剩72小时可获取的2026终极对比手册(含Prompt工程调优参数表、国产信创环境适配补丁包、等保2.0三级适配验证清单):ChatGPT与Gemini,你选错一个就多花237万年运维成本
  • nv-design:自动化搭建设计师与前端开发者的本地工具链
  • 短视频矩阵系统技术选型:从自研到 SaaS 的成本与收益分析
  • WPF动画避坑指南:Blend路径动画Canvas.Left与RenderTransform的实战选择(附性能对比)
  • 终极指南:如何用GHelper轻松管理华硕笔记本性能与电池健康
  • 规划求解(Solver)实战:利用Excel的Solver工具进行投资组合优化
  • DownKyi音视频分离技术解析:从容器格式到素材提取的专业实践
  • 你做RAG,错在第一步
  • skillpm包管理器:下一代依赖管理工具的设计原理与实战指南
  • 2026年4月硅胶布供应商推荐,灭火毯/高硅氧布/锂电池灭火毯/芳纶布/石英布/高硅氧纤维/保温套,硅胶布供应商哪家可靠 - 品牌推荐师
  • 为什么92%的AI团队Serverless化失败?奇点大会披露的4个反直觉架构断点与实时熔断方案
  • 从SRT算法到现代CPU:为什么你的处理器除法这么快?
  • 高频电路实战:基于Multisim的调幅发射机设计与调试全解析
  • 从游戏角色到人脸分析:聊聊‘摇头、点头、转头’背后的欧拉角与万向节死锁
  • AI驱动的产品探索副驾:如何用系统提示词实现高效用户研究
  • 别再为ESXi证书错误头疼了!巧用Nginx反向代理+FRP,实现HTTPS域名安全访问内网后台
  • FastAPI 最佳实践:构建高性能电商后端
  • 金融/医疗/政务场景紧急适配!SITS 2026 v1.0已开放首批200个白名单接入名额(含FATE兼容桥接器与GDPR合规审计模板)