调优建议

Elasticsearch BES

  • 邀测版存储计算分离套餐介绍
  • 功能发布记录
  • 产品描述
    • 基本概念
    • 关键特性
    • 产品介绍
    • 产品性能
      • 4核16GB512GB通用型的3个数据节点实例基准性能指标
      • 8核16GB512GB计算型的3个数据节点实例基准性能测试
      • 16核32GB512GB计算型的3个数据节点实例基准性能指标
      • 4核8GB512GB计算型的3个数据节点实例基准性能测试
      • 8核32GB512GB通用型的3个数据节点实例基准性能指标
      • 16核64GB512GB通用型的3个数据节点实例基准性能指标
      • 概述
  • Python-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • Kibana
    • Kibana使用指南
  • Logstash
    • Logstash使用指南
    • 实例管理
      • 实例详情信息
      • 实例扩缩容
      • 管道管理
      • 创建实例
      • 实例列表
      • 删除实例
  • 开发指南
    • Elasticsearch Restful API
    • 通过其他客户端访问Elasticsearch
    • Elasticsearch Java客户端
      • Low Level REST Client
      • Rest Client操作向量索引示例
      • Java REST Client
      • High Level REST Client
  • Java-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • 向量检索特性
    • 资源规划
    • 关键概念
    • 应用场景
    • 快速入门
    • 算法介绍
    • 能力简介
    • 向量数据库
    • 操作指南
      • 写入和查询数据
      • 训练模型
      • 向量索引缓存管理
      • 创建索引
      • 基于Reciprocal Rank Fusion的融合查询
      • 参数优化
      • 7.4版本兼容说明
    • 最佳实践
      • 调优建议
      • BES RAG 最佳实践:基于LangChain+BES的私域知识的QA问答系统
    • 迁移方案
      • ES dense vector 切换为BES方案
  • ELK
    • 基于ELK构建日志分析系统
  • 增强特性
    • 慢查询隔离
    • 百度NLP中文分词词典动态更新
    • 百度NLP中文分词插件
    • 基于段文件的主从复制
    • 基于BOS的冷热数据分离
  • 快速入门
    • 访问Elasticsearch服务
    • 导入数据并搜索
    • 创建集群
    • 集群资源评估
  • 典型实践
    • 使用BSC将BOS中的数据导入Es
    • 使用BSC将Kafka中的数据导入Es
    • 基于CCR实现多集群跨地域高可用
    • 基于节点磁盘介质的冷热数据分离
  • 服务等级协议SLA
    • 数据迁移服务协议
    • BES服务等级协议SLA(V1.0)
  • 常见问题
    • Spark访问Es常见问题
    • Elasticsearch系统常见问题
    • 常见问题总览
  • 产品定价
    • 预付费
    • 计费说明
    • 配置变更费用说明
    • 后付费
  • API文档
    • 概述
    • 自动续费相关接口
      • 续费列表
      • 查看自动续费
      • 查看自动续费规则列表
      • 续费操作
      • 更新自动续费规则
      • 删除自动续费规则
      • 创建自动续费规则
    • 插件配置接口
      • 上传自定义插件
      • 卸载系统默认插件
      • 上传nlp词典
      • 安装系统默认插件
      • 获取默认和自定义插件列表
      • 卸载自定义插件
      • 安装自定义插件
      • 删除自定义插件
      • 查看nlp词典
    • 日志管理相关接口
      • 查看日志导出任务记录
      • 创建日志导出任务
      • 日志设置
      • 日志查询
    • 标签接口
      • 查询标签列表
      • 批量新增标签
      • 单个集群更新标签
    • 智能巡检接口
      • 查看近7天已完成的巡检任务列表
      • 近七天巡检概况
      • 查看手动巡检任务的配置
      • 集群巡检授权
      • 列举所有可选巡检项
      • 查询是否可以提交巡检任务
      • 最新一次巡检概况
      • 查看集群是否开启自动巡检
      • 修改手动巡检任务的配置
      • 开启或关闭自动巡检
      • 提交手动巡检任务
      • 查询今日已执行完成的手动巡检次数
      • 查看某巡检任务的执行状态和结果
    • 集群相关接口
      • 获取操作历史信息
      • 删除集群
      • 新增节点类型
      • 开启和关闭https
      • 查看集群详情信息
      • 重置密码
      • EIP绑定
      • EIP解绑
      • 是否开启Grafana监控
      • 获取数据量观测数据
      • 查看集群列表
      • 上传NLP分词词典
      • 创建集群
      • 智能评估
      • 集群blb信息
      • 用户可用代金券列表
      • 停止集群
      • 扩容集群
      • 启动集群
      • 重启集群
    • 实例相关接口
      • 批量停止实例
      • 启动实例
      • 查看缩容节点列表
      • 数据迁移
      • 数据迁移系统建议
      • 批量启动实例
      • 数据迁移回滚
      • 停止实例
      • 数据迁移节点列表
      • 删除实例
    • 配置修改相关接口
      • 获取同义词文件列表
      • 查看集群配置
      • 删除同义词配置文件
      • 上传同义词配置文件
      • 配置修改
    • 定时调度
      • 更新定时调度任务
      • 删除定时调度任务
      • 创建和更新定时调度任务
      • 查看定时调度任务
  • API3.0
    • 集群相关接口
      • 删除集群
  • Elasticsearch
    • 用户手册
      • YML参数配置
      • 权限管理
      • 智能巡检
      • 数据迁移
      • 基于BOS的快照与恢复
      • 集群列表
      • 账号使用说明
      • 多可用区部署
      • 定时调度
      • 数据量观测
      • 日志查询
        • 日志查询(旧)
        • 日志查询(新)
        • 日志导出
        • 查询语法
      • 集群配置
        • 配置同义词
      • 插件管理
        • 上传与安装自定义插件
        • Elasticsearch插件列表
        • 系统默认插件
          • analysis-pinyin拼音分词插件
          • IK中文分词插件与动态更新词典
          • compression-zstd插件
          • CCR插件
          • 限流插件
          • 动态同义词插件
          • 简繁体转换插件
          • ingest attachment插件
          • SQL插件
      • 配置变更
        • 节点数据迁移
        • 集群变配说明与建议
        • 集群扩缩容
      • 版本升级
        • 升级版本
        • 内核版本说明
        • 升级检查
      • 集群监控报警
        • 监控查看及指标说明
        • 配置报警
      • 集群管理
        • 集群重启
        • 变更HTTPS协议用户指南
        • 节点启停
        • 查看集群信息
        • 集群创建
        • 公网绑定
        • 修改集群名称
        • 跨可用区迁移集群
        • 集群删除
        • 集群列表
        • 自动续费
        • 密码重置
        • ES服务区域代码
      • 账户管理
        • 多用户访问控制
所有文档
menu
没有找到结果,请重新输入

Elasticsearch BES

  • 邀测版存储计算分离套餐介绍
  • 功能发布记录
  • 产品描述
    • 基本概念
    • 关键特性
    • 产品介绍
    • 产品性能
      • 4核16GB512GB通用型的3个数据节点实例基准性能指标
      • 8核16GB512GB计算型的3个数据节点实例基准性能测试
      • 16核32GB512GB计算型的3个数据节点实例基准性能指标
      • 4核8GB512GB计算型的3个数据节点实例基准性能测试
      • 8核32GB512GB通用型的3个数据节点实例基准性能指标
      • 16核64GB512GB通用型的3个数据节点实例基准性能指标
      • 概述
  • Python-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • Kibana
    • Kibana使用指南
  • Logstash
    • Logstash使用指南
    • 实例管理
      • 实例详情信息
      • 实例扩缩容
      • 管道管理
      • 创建实例
      • 实例列表
      • 删除实例
  • 开发指南
    • Elasticsearch Restful API
    • 通过其他客户端访问Elasticsearch
    • Elasticsearch Java客户端
      • Low Level REST Client
      • Rest Client操作向量索引示例
      • Java REST Client
      • High Level REST Client
  • Java-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • 向量检索特性
    • 资源规划
    • 关键概念
    • 应用场景
    • 快速入门
    • 算法介绍
    • 能力简介
    • 向量数据库
    • 操作指南
      • 写入和查询数据
      • 训练模型
      • 向量索引缓存管理
      • 创建索引
      • 基于Reciprocal Rank Fusion的融合查询
      • 参数优化
      • 7.4版本兼容说明
    • 最佳实践
      • 调优建议
      • BES RAG 最佳实践:基于LangChain+BES的私域知识的QA问答系统
    • 迁移方案
      • ES dense vector 切换为BES方案
  • ELK
    • 基于ELK构建日志分析系统
  • 增强特性
    • 慢查询隔离
    • 百度NLP中文分词词典动态更新
    • 百度NLP中文分词插件
    • 基于段文件的主从复制
    • 基于BOS的冷热数据分离
  • 快速入门
    • 访问Elasticsearch服务
    • 导入数据并搜索
    • 创建集群
    • 集群资源评估
  • 典型实践
    • 使用BSC将BOS中的数据导入Es
    • 使用BSC将Kafka中的数据导入Es
    • 基于CCR实现多集群跨地域高可用
    • 基于节点磁盘介质的冷热数据分离
  • 服务等级协议SLA
    • 数据迁移服务协议
    • BES服务等级协议SLA(V1.0)
  • 常见问题
    • Spark访问Es常见问题
    • Elasticsearch系统常见问题
    • 常见问题总览
  • 产品定价
    • 预付费
    • 计费说明
    • 配置变更费用说明
    • 后付费
  • API文档
    • 概述
    • 自动续费相关接口
      • 续费列表
      • 查看自动续费
      • 查看自动续费规则列表
      • 续费操作
      • 更新自动续费规则
      • 删除自动续费规则
      • 创建自动续费规则
    • 插件配置接口
      • 上传自定义插件
      • 卸载系统默认插件
      • 上传nlp词典
      • 安装系统默认插件
      • 获取默认和自定义插件列表
      • 卸载自定义插件
      • 安装自定义插件
      • 删除自定义插件
      • 查看nlp词典
    • 日志管理相关接口
      • 查看日志导出任务记录
      • 创建日志导出任务
      • 日志设置
      • 日志查询
    • 标签接口
      • 查询标签列表
      • 批量新增标签
      • 单个集群更新标签
    • 智能巡检接口
      • 查看近7天已完成的巡检任务列表
      • 近七天巡检概况
      • 查看手动巡检任务的配置
      • 集群巡检授权
      • 列举所有可选巡检项
      • 查询是否可以提交巡检任务
      • 最新一次巡检概况
      • 查看集群是否开启自动巡检
      • 修改手动巡检任务的配置
      • 开启或关闭自动巡检
      • 提交手动巡检任务
      • 查询今日已执行完成的手动巡检次数
      • 查看某巡检任务的执行状态和结果
    • 集群相关接口
      • 获取操作历史信息
      • 删除集群
      • 新增节点类型
      • 开启和关闭https
      • 查看集群详情信息
      • 重置密码
      • EIP绑定
      • EIP解绑
      • 是否开启Grafana监控
      • 获取数据量观测数据
      • 查看集群列表
      • 上传NLP分词词典
      • 创建集群
      • 智能评估
      • 集群blb信息
      • 用户可用代金券列表
      • 停止集群
      • 扩容集群
      • 启动集群
      • 重启集群
    • 实例相关接口
      • 批量停止实例
      • 启动实例
      • 查看缩容节点列表
      • 数据迁移
      • 数据迁移系统建议
      • 批量启动实例
      • 数据迁移回滚
      • 停止实例
      • 数据迁移节点列表
      • 删除实例
    • 配置修改相关接口
      • 获取同义词文件列表
      • 查看集群配置
      • 删除同义词配置文件
      • 上传同义词配置文件
      • 配置修改
    • 定时调度
      • 更新定时调度任务
      • 删除定时调度任务
      • 创建和更新定时调度任务
      • 查看定时调度任务
  • API3.0
    • 集群相关接口
      • 删除集群
  • Elasticsearch
    • 用户手册
      • YML参数配置
      • 权限管理
      • 智能巡检
      • 数据迁移
      • 基于BOS的快照与恢复
      • 集群列表
      • 账号使用说明
      • 多可用区部署
      • 定时调度
      • 数据量观测
      • 日志查询
        • 日志查询(旧)
        • 日志查询(新)
        • 日志导出
        • 查询语法
      • 集群配置
        • 配置同义词
      • 插件管理
        • 上传与安装自定义插件
        • Elasticsearch插件列表
        • 系统默认插件
          • analysis-pinyin拼音分词插件
          • IK中文分词插件与动态更新词典
          • compression-zstd插件
          • CCR插件
          • 限流插件
          • 动态同义词插件
          • 简繁体转换插件
          • ingest attachment插件
          • SQL插件
      • 配置变更
        • 节点数据迁移
        • 集群变配说明与建议
        • 集群扩缩容
      • 版本升级
        • 升级版本
        • 内核版本说明
        • 升级检查
      • 集群监控报警
        • 监控查看及指标说明
        • 配置报警
      • 集群管理
        • 集群重启
        • 变更HTTPS协议用户指南
        • 节点启停
        • 查看集群信息
        • 集群创建
        • 公网绑定
        • 修改集群名称
        • 跨可用区迁移集群
        • 集群删除
        • 集群列表
        • 自动续费
        • 密码重置
        • ES服务区域代码
      • 账户管理
        • 多用户访问控制
  • 文档中心
  • arrow
  • ElasticsearchBES
  • arrow
  • 向量检索特性
  • arrow
  • 最佳实践
  • arrow
  • 调优建议
本页目录
  • 查询模块
  • 保证ES节点有充足的内存
  • 首次查询之前把数据进行预加载
  • 尽量减少segment的数量
  • 尽量避免从_source中查询向量字段
  • 尽量使用doc_value存储数据
  • 关闭默认的自动构建mapping开关
  • 规避使用_source存储数据,减少查询过程中的数据加载量
  • 写入模块
  • 合理配置shard数量
  • 合理设置replica的数量
  • 合理调整refresh间隔
  • 写入速度流程优化
  • 使用bulk请求写入数据
  • 增加索引构建并发
  • 自动生成DocumentID

调优建议

更新时间:2025-08-20

查询模块

保证ES节点有充足的内存

ES默认分配节点一半的内存给JVM(最多会分配30GB),剩余的内存用于向量索引和pagecache,节点内存不足会导致频繁触发向量索引的驱逐和加载,导致查询延迟较高。

因此需要确保数据节点有足够的内存,使向量索引常驻内存。可以通过以下方式获取节点向量数据的内存使用情况。

Plain Text
1GET /_bpack/_knn/stats
2GET /_bpack/_knn/nodeId1,nodeId2/stats // 获取指定节点nodeId1,nodeId2的内存使用情况,使用逗号进行分割

如果发现内存不足,建议参考资源评估建议进行集群容量规划。

首次查询之前把数据进行预加载

默认情况下,ES的向量索引构建完成后,不会主动加载到内存中。并且在首次查询中会触发加载,只有向量数据全部加载到内存中才能进行查询。

在首次查询前,可以通过如下指令提前预热数据,降低延迟:

Plain Text
1GET /_bpack/_knn/warmup/my_index1, my_index2

尽量减少segment的数量

ES中的索引的基础存储单元为segment。在KNN算法中,每个segment都会单独构建向量索引,因此在搜索过程中需要检索每个segment。

如果索引中segment的划分过于琐碎,会影响检索的速度。一般情况下,可以通过BES的定时任务,定期把琐碎的segment合并。

当然也可以在写入结束后的业务低峰期,通过force_merge强制执行合并,减少segment的数量,提高检索的效率。

Plain Text
1POST /my-index-000001/_forcemerge?max_num_segments=3

尽量避免从_source中查询向量字段

在构建索引过程中默认会把原始JSON存储在_source字段中,因此搜索结果中的每一次命中索引都包含完整的_source内容。

当索引包含高维度向量字段时,_source可能比较大,加载成本就很高,这可能会显著降低KNN搜索的速度。

尽量使用doc_value存储数据

doc_value和_source存储的内容是一致的,但是doc_value是面向列式存储的,因此会拥有更好的排序和聚合效率。

创建索引过程中,不需要特地打开 doc_value 开关,ES对于绝大多数类型的数据会自动构建 doc_value 。

Plain Text
1对于 text 类型的数据,不会构建 doc_value 而是存储在 _source 中。
2因此如果可以的话,建立索引过程中尽量使用 keyword 类型代替 text 类型。

查询过程中,可以指定查询doc_value中字段,减少加载_source数据,加速查询效率。

查询方式如下所示:

JSON
1GET /my_index/_search
2{
3  "query": {
4    "hnsw": {
5      "vec": {
6        "vector": [
7          0.495662,
8          
9          ...
10         
11          -0.10869
12        ],
13        "k": 10,
14        "ef": 200
15      }
16    }
17  },
18  "size": 10,
19  "_source":false, // 规避加载 _source 中的数据,加速查询效率
20  "docvalue_fields":[
21    "id",
22    "tag_keyword"
23  ] // 填写需要从 doc_value 中查询的字段
24}

关闭默认的自动构建mapping开关

对于字符串类型的字段,自动构建的mapping会默认同时构建text和keyword类型数据,比较浪费磁盘空间。 如果不需要对字段进行全文检索,则只需要设置keyword类型即可。

也可以通过下面配置,设置默认构建单一类型:

JSON
1PUT index
2{
3  "mappings": {
4    "dynamic_templates": [
5      {
6        "strings": {
7          "match_mapping_type": "string",
8          "mapping": {
9            "type": "keyword"
10          }
11        }
12      }
13    ]
14  }
15}

规避使用_source存储数据,减少查询过程中的数据加载量

在构建索引的过程中,可以通过如下方式禁用_source字段:

JSON
1PUT my-index-000001
2{
3  "mappings": {
4    "_source": {
5      "enabled": false
6    }
7  }
8}

但是禁用_source的操作需要您深思熟虑后进行,因为禁用_source后以下功能将无法使用

  • 无法使用update, update_by_query以及reindex的API,也无法从一个集群的索引reindex到另一个集群
  • 无法使用高亮
  • 不能修改索引的mappings和analysis

也可以对向量字段不构建_source,只对标量字段构建

JSON
1PUT my-index-000001
2{
3  "mappings": {
4    "_source": {
5      "excludes": [
6        "vec",  // 可以直接指定不构建_source的字段
7        "vec.*" // 也可以通过通配符进行模糊匹配
8      ]
9    }
10  }
11}

写入模块

合理配置shard数量

为了使shard分配的更加均匀,从而避免写入热点,建议把shard数量设置成节点数量的整数倍。

shard数量设置方法如下所示:

JSON
1PUT /my_index
2{
3  "settings": {
4    "index": {
5      "number_of_shards": 3 // 索引的分片数量,创建后无法修改。
6    }
7  }
8}

合理设置replica的数量

没有副本意味着节点丢失可能会导致数据丢失,因此多副本对于数据安全十分重要,以便在出现问题时可以重新加载数据。

并且适度增加副本数量,可以增大查询过程中的并行程度,从而提高查询效率。

每增加一个副本都会增加集群磁盘成本,并且副本数不能大于节点的数量。

JSON
1在多副本情况下,写入过程可以先设置副本数 index.number_of_replicas 为0,增加写入的速度。
2PUT /my_index/_settings
3{
4  "number_of_replicas": 0 // 分片的副本数量,取值范围[0, 节点数-1],可随时修改
5}
6在写入完成后,再把副本调整到合适的数量。

合理调整refresh间隔

refresh_interal是用来控制多久把内存里的数据刷出segment的。ES会对刷出的segment进行合并,如果合并不过来会阻止写入。

所以把refresh_interval调大,也可以把刷出的segment变大,降低合并的频率,提升导入性能。

调整refresh_interval方式如下:

JSON
1PUT /my_index/_settings
2{
3 	"index.refresh_interval": "10s"
4}

写入速度流程优化

使用bulk请求写入数据

bulk请求写入效率比单个索引请求性能更好,尽量使用bulk请求进行数据写入。

Plain Text
1为了知道批量请求的最佳大小,可以在具有单index的单节点集群进行上进行测试。
2首先尝试一个批次包含100个document,之后测试一个批次包含200个,以此类推,在每次测试过程中将批量请求中的document数量增加一倍。
3当索引构建的速度开始趋于平稳时,批量请求需要包含的document数据就达到了的最佳大小。
增加索引构建并发

当构建较大数据量的向量索引时,可能会出现build较慢的情况。 可以根据分片数和节点CPU核数,在写入数据前适当调整"bpack.knn.hnsw.index_thread_qty" 。

例如,1kw数据量,1节点2分片,节点为16核CPU,我们可以把"bpack.knn.hnsw.index_thread_qty" 设置为4-6(如果设置为8,会使CPU满载,生产环境可能有风险),可以提高构建索引效率。

调节方式如下:

JSON
1PUT /_cluster/settings
2{
3    "persistent" : {
4        "bpack.knn.hnsw.index_thread_qty":3
5    }
6}

"bpack.knn.hnsw.index_thread_qty" 参数设置偏大,会导致构建时启动线程过多。在负载比较高的集群,不建议调整这个参数,以免集群满载。

如果写入和构建向量索引偏慢,可以通过临时减少集群负载(减少其他写入和查询),并调大"bpack.knn.hnsw.index_thread_qty"的方式来加快构建 ,等到构建结束,再将"bpack.knn.hnsw.index_thread_qty" 调整回1。

自动生成DocumentID

当写入索引过程中指定 _id 时,ES需要检查同一分片中是否已存在具有相同 _id 的document,这是一项成本高昂的操作,并且随着索引的增长,成本会变得更高。

如果使用场景允许,建议写入过程中不指定_id, ES可以跳过检查,从而加快索引速度。

JSON
1POST _bulk
2{ "create" : { "_index" : "test1"} }  // 不指定 _id
3{ "create" : { "_index" : "test2", "_id" : "3" } } // 指定 _id

上一篇
操作指南
下一篇
BES RAG 最佳实践:基于LangChain+BES的私域知识的QA问答系统