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

【Elasticsearch】 查询优化方式

在优化Elasticsearch的查询性能时,可以从多个维度着手,包括索引设计、查询优化、集群配置、数据管理以及监控分析等。常见的优化方式和策略有以下几种:


一、索引优化

  1. 合理设计字段类型

    • 字段类型选择
      • 对于不需要分词的字段(如ID、分类、标签),使用 keyword 类型。
      • 需要分词的字段(如文本内容)使用 text 类型,并选择合适的分词器(如 standardik_max_word 等)。
    • 避免过度分词:减少不必要的分词操作,例如对短文本使用 keyword 类型。
  2. 字段映射优化

    • 禁用不需要的功能
      • 对不需要存储原始值的字段,设置 "store": false
      • 对不需要高亮的字段,设置 "index_options": "freq""positions"(根据需求)。
    • 禁用动态映射:通过 dynamic: false 防止自动添加未知字段,避免索引膨胀。
  3. 分片和副本策略

    • 分片数量:根据数据量和查询负载合理设置分片数。分片过多会增加协调节点压力,分片过少可能导致负载不均。
      • 公式参考:分片数 ≈ (总数据量) / (单分片最大合理大小,如30-50GB)
    • 副本数量:通常设置1个副本以保证高可用,但副本过多会增加写入延迟。
  4. 索引模板和别名管理

    • 使用 索引模板 统一配置索引设置(如分片、映射)。
    • 通过 别名 管理索引生命周期(如滚动更新索引时减少停机时间)。
  5. 文档大小控制

    • 避免存储过大文档(默认限制为1GB),可通过 index.max_inner_result_window 调整,但过大会影响性能。

二、查询优化

  1. 减少返回数据量

    • 字段过滤:使用 source filtering_source: { includes: [...] })只返回必要字段。
    • 避免使用 _all 字段:Elasticsearch 7.0+ 已移除 _all,但需确保字段映射明确。
    • 分页优化
      • 避免 from/to 分页(尤其是大分页),改用 search_afterscroll API。
      • search_after 基于排序值分页,效率更高。
  2. 查询结构优化

    • 使用布尔查询(Bool Query)
      • 将过滤条件放在 filter 子句中(利用缓存)。
      • 将评分相关的条件放在 mustshould 子句中。
    • 避免通配符查询
      • 避免在通配符查询(如 *?)的开头使用 *,否则会导致全索引扫描。
    • 使用短路逻辑
      • bool 查询中,将高命中率的条件放在前面,减少后续条件的计算。
  3. 缓存利用

    • 查询缓存
      • 对于频繁且相同的查询(如过滤条件固定),Elasticsearch 会自动缓存结果。
      • 确保查询的 cacheable 属性为 true(避免使用 script 或随机函数)。
    • 请求缓存:通过 request_cache 缓存查询的中间结果(需谨慎使用,可能占用内存)。
  4. 避免脚本查询

    • 脚本(如 scriptscript_score)会显著降低性能,尽量改用字段直接查询。
  5. 聚合优化

    • 预聚合数据:对高频聚合需求(如统计报表),可预先计算并存储结果。
    • 使用 terms 聚合的 size 参数:限制返回的桶数量,避免内存溢出。
    • 分页聚合:使用 after_key 分页处理大量聚合结果。

三、集群配置优化

  1. 硬件资源

    • 内存:确保足够的堆内存(通常为总内存的50%),避免频繁GC。
    • 存储:SSD比HDD快,尤其是写入密集型场景。
    • CPU:多核CPU可提升并行查询和分片处理能力。
  2. JVM 和 GC 调整

    • 使用 G1GC(默认)或 ZGC(Elasticsearch 7.10+)。
    • 调整堆内存大小(ES_HEAP_SIZE),避免过大或过小。
  3. 索引刷新和合并策略

    • 刷新间隔:默认 1s,写入密集时可适当调大(如 30s)以减少 I/O。
    • 合并策略:通过 index.merge.policy 调整,避免过多小分片文件。
  4. 分片分配和负载均衡

    • 使用 cluster.routing.allocation 控制分片分布,避免热点节点。
    • 定期检查分片分布(_cat/shards),必要时进行手动迁移。

四、数据管理

  1. 数据清理和归档

    • 定期删除或归档旧数据,避免索引过大影响性能。
    • 使用 CuratorIndex Lifecycle Management (ILM) 管理索引生命周期。
  2. 文档预处理

    • 对文本字段进行预处理(如小写化、停用词过滤),减少查询时的计算开销。
  3. 数据分片策略

    • 使用 routing 参数将相关文档分配到同一分片,减少跨分片查询。

五、监控与分析

  1. 性能分析工具

    • Profile API:通过 _profile 分析查询执行细节,定位慢查询。
    • 慢查询日志:配置 slowlog 记录执行时间超过阈值的查询。
    • 监控工具:使用 Kibana 的 Monitoring、Prometheus + Grafana 或 Elasticsearch 的 _cat API。
  2. 查询性能指标

    • 关注 took 时间、total_hits、分片响应时间(_shards)。
    • 检查缓存命中率(_nodes/stats/breaker)和 GC 情况。
  3. 定期维护

    • 强制合并分片:使用 forcemerge 减少分片文件数量,提升搜索性能。
    • 索引优化:对冷数据进行只读索引优化(如设置 index.blocks.write)。

六、其他高级优化

  1. 近实时搜索

    • 根据业务需求调整 refresh_interval,平衡写入和搜索延迟。
  2. 跨集群搜索(CCS)

    • 对于跨集群查询,使用 Cross Cluster Search 并优化网络延迟。
  3. 使用专用节点角色

    • 分离主节点、数据节点和协调节点,避免角色冲突影响性能。
  4. 数据预热(Preloading)

    • 对新索引进行预热(_flushforcemerge),减少首次查询延迟。

总结

优化Elasticsearch查询需要结合具体场景,从索引设计、查询结构、集群配置、数据管理等多方面入手。关键步骤包括:

  1. 合理设计字段和映射
  2. 减少查询返回的数据量
  3. 利用缓存和分页优化
  4. 监控和分析慢查询
  5. 定期维护集群和索引健康状态

相关文章:

【Elasticsearch】 查询优化方式

在优化Elasticsearch的查询性能时,可以从多个维度着手,包括索引设计、查询优化、集群配置、数据管理以及监控分析等。常见的优化方式和策略有以下几种: 一、索引优化 合理设计字段类型: 字段类型选择: 对于不需要分词的…...

Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案

在使用 Xcode 16.4 构建项目,运行到 iOS 18.3 或更早版本系统(包括模拟器)时,出现了如下的运行时崩溃: dyld[22183]: Symbol not found: ___cxa_current_primary_exceptionReferenced from: /.../WidgetOn.app/Widget…...

【linux】全志Tina预编译一个so库文件到根文件系统/usr/lib/下

一、sdk中新建文件夹 路径: V:\t113\work3\t113\openwrt\package\feeds\libs\md5util md5util为需要注入的库文件夹。 文件结构 libs md5util files libmd5util.so makefile etc.. 二、编写makefile include $(TOPDIR)/rules.mkPKG_NAME : md5util PKG_VERSIO…...

C# 类和继承(成员访回修饰符)

成员访回修饰符 本章之前的两节阐述了类的可访问性。对类的可访问性,只有两种修饰符:internal和public。 本节阐述成员的可访问性。类的可访问性描述了类的可见性;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…...

c++ stl容器之map用法

目录 (1)map介绍 (2)map、multimap、unordered_map区别 (3)map用法 1.map接口表 2.使用举例 插入数据与遍历数据 查找关键字和值 删除元素 按照值排序 (4)multimap用法 &…...

Linux-文件管理及归档压缩

1.根下的目录作用说明: /:Linux系统中所有的文件都在根下/bin:(二进制命令目录)存放常用的用户命令/boot:系统启动时的引导文件(内核的引导配置文件,grub配置文件,内核配置文件) 例…...

结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南

基于最佳实践的Spring Boot自动化部署实战指南,结合Jenkins、Docker和Kubernetes等主流工具,提供从环境搭建到生产部署的完整流程: 一、环境准备与工具选型​​ ​​1.基础设施​​ ​​Jenkins服务器​​:安装Jenkins LTS版本,配置JDK(推荐JDK 11+)及Maven/Gradle插…...

微软认证考试科目众多?该如何选择?

在云计算、人工智能、数据分析等技术快速发展的今天,微软认证(Microsoft Certification)已成为IT从业者、开发者、数据分析师提升竞争力的重要凭证。但面对众多考试科目,很多人不知道如何选择。本文将详细介绍微软认证的考试方向、…...

MCP协议在LLM系统中的架构与实现原理研究

MCP协议的角色和功能定位 模型上下文协议(Model Context Protocol, MCP) 是由Anthropic公司(Claude模型的发布方)提出的一种开放协议,旨在标准化大型语言模型(LLM)与外部数据源、工具和服务之间的交互方式。可以将MCP类比为AI应用的“USB-C接口”:通过统一的接口协议,…...

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章: dify里的大模型是怎么添加进来的:在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用:PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…...

【LC实战派】小智固件编译

这篇写给立创吴总,是节前答应他配合git代码的说明;也给所有对小智感兴趣的小伙伴。 请多提意见,让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中实际的…...

HTTP(超文本传输协议)详解

目录 一、基本概念 二、HTTP报文(结构) (一) 请求报文 (二) 响应报文 三、HTTP请求方法 1. GET方法 2. POST方法 3. PUT方法 4. HEAD方法 5. DELETE 6. OPTIONS 一、知识扩展 7. TRACE 8. CONNECT 四、HTTP持久通信 (一) HTTP keep-alive…...

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…...

jdbcTemplate.query备忘录

jdbcTemplate.query中使用全部字符串和参数注入&#xff0c; 查询速度为什么差距这么大 如何正确使用JdbcTemplate参数化查询 1、使用?占位符 String sql "SELECT * FROM users WHERE name LIKE ?"; List<User> users jdbcTemplate.query(sql,new Object[…...

如何搭建Z-Blog PHP版本:详细指南

Z-Blog是一款功能强大且易于使用的博客平台&#xff0c;支持PHP和ASP两种环境。本文将重点介绍如何在PHP环境下搭建Z-Blog博客系统&#xff0c;帮助您快速上线自己的个人博客站点。 准备工作 1. 获取Z-Blog PHP版本 首先&#xff0c;访问Z-Blog官方网站下载最新版本的Z-Blog…...

Docker 常用命令详解

&#x1f433; Linux 安装 Docker 及常用命令详解&#xff08;适用于 Ubuntu&#xff09; &#x1f4e6; 一、安装 Docker&#xff08;Ubuntu 系统&#xff09; 1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装必要依赖 sudo apt install -y apt-transport-https …...

uniapp uni-id-co errCode“:“uni-id-captcha-required“,“errMsg“:“Captcha required

连续登录失败后就会出现图形验证码校验&#xff0c;如果前端不需要图形验证码校验&#xff0c;uni-id-co文件夹下找到module下的login文件夹下的login.js,注释掉Captcha相关校验&#xff0c;关掉即可 const {preLoginWithPassword,postLogin } require(../../lib/utils/login)…...

Github Copilot新特性:Copilot Spaces-成为某个主题的专家

概述 当今的工程团队都会面临知识碎片化的问题。关键的上下文分散在代码、文档和团队成员的头脑中&#xff0c;这使得他们很难在一个新的领域快速上手并完成工作。Copilot Spaces 通过集中您的项目上下文解决了这个问题&#xff0c;因此 Copilot 可以根据您的工作提供更智能、…...

React 第五十三节 Router中 useRouteError 的使用详解和案例分析

前言 useRouteError 是 React Router v6.4 引入的关键错误处理钩子&#xff0c;用于在 路由错误边界&#xff08;Error Boundary&#xff09; 中获取路由操作过程中发生的错误信息。 它提供了优雅的错误处理机制&#xff0c;让开发者能够创建用户友好的错误界面。 一、useRou…...

12分钟讲解主流React库

本内容是对 Every React Library Explained in 12 Minutes 内容的翻译与整理。 React Router React Router 是一个用于控制网站导航的库&#xff0c;同时也允许你自定义网站的 URL。它使用自定义组件&#xff0c;如 BrowserRouter、Routes 和 Route 组件&#xff0c;以创建 UR…...

《doubao-lite-32k 模型缓存机制使用指南》

doubao-lite-32k 模型缓存机制使用指南 一、缓存概述 1. 缓存作用 doubao-lite-32k 模型的缓存(Session 缓存)主要用于多轮对话场景,实现以下功能: 存储历史对话信息(Token),避免重复传输上下文,减少计算资源消耗。 优化长上下文(最长 32K Token)处理效率,提升多…...

攻防世界-XCTF-Web安全最佳刷题路线

每次写序都是最烦恼的&#xff0c;都不知道写什么&#xff0c;CTF是团队竞赛&#xff0c;有很多分支&#xff08;Web安全&#xff0c;密码学&#xff0c;杂项&#xff0c;Pwn&#xff0c;逆向&#xff0c;安卓&#xff09;&#xff0c;可以每个领域都涉猎&#xff0c;或许感觉那…...

t021-高校物品捐赠管理系统【包含源码材料!!!!】

视频演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息…...

设计模式——面向对象设计六大原则

摘要 本文详细介绍了设计模式中的六大基本原则&#xff0c;包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则和合成复用原则。每个原则都通过定义、理解、示例三个部分进行阐述&#xff0c;旨在帮助开发者提高代码的可维护性和灵活性。通过具体代码…...

Python制作史莱姆桌面宠物!可爱的

史莱姆桌面宠物 一个可爱的桌面史莱姆宠物&#xff0c;它会在您的任务栏上移动并提供可视化设置界面。 这里写目录标题 史莱姆桌面宠物功能特点安装与运行直接运行方式创建可执行文件 使用说明自定义GIF说明打包说明开源地址 功能特点 可爱的史莱姆在任务栏上自动移动支持…...

React hook之userReducer

在 React 中&#xff0c;useReducer 是一个用于管理复杂状态逻辑的 Hook&#xff0c;它类似于 Redux 中的 reducer 模式&#xff0c;但更轻量且适用于组件内部或结合 Context API 实现全局状态管理。以下是 useReducer 的详细用法指南&#xff1a; 1. 基本语法 const [state, …...

Dify源码教程:账户和密码传递分析

概述 Dify系统中账户创建过程中的密码处理是Web应用安全的重要环节。本教程详细分析了从前端表单到后端存储的完整流程&#xff0c;展示了Dify如何安全地处理用户凭据。 前端部分 在 dify/web/app/install/installForm.tsx 文件中&#xff0c;当用户填写完表单并点击安装按钮…...

如果科技足够发达,是否还需要维持自然系统(例如生物多样性)中那种‘冗余’和‘多样性’,还是可以只保留最优解?

这是一个非常深刻的问题&#xff0c;触及到了进化生物学、复杂系统理论和未来科技哲学的交汇点。 你可以这样理解这个问题的结构&#xff1a; “如果科技足够发达&#xff0c;是否还需要维持自然系统&#xff08;例如生物多样性&#xff09;中那种‘冗余’和‘多样性’&#x…...

数据分析图表类型及其应用场景

说明&#xff1a;顶部HTML文件下载后可以直接查看&#xff0c;带有示图。 摘要 数据可视化作为现代数据分析的核心环节&#xff0c;旨在将复杂、抽象的数据转化为直观、易懂的图形形式。这种转化显著提升了业务决策能力&#xff0c;优化了销售与营销活动&#xff0c;开辟了新…...

第四十二天打卡

知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 # 定义一个回调函数 def handle_result(result):"""处理计算结果的回调函数"""print(f"计算结果是: {result}")# 定…...