Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景

集群配置为:8 个 node 节点,16 核 32G,索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。

  • 1、应用对查询要求比较高,search 没有慢查询的状态。

  • 2、集群压测性能不能上去,cpu 使用未打满,查询的 qps 上不去,且有队列堆积。

2、优化方法

通过云厂商内核组的同学抓取火焰图发现,主要消耗在 fetch phrase 阶段。

ES 默认从_source 取,每次查询都会读取一行数据,并需要做解压,如果对查询耗时要求比较高,应当在查询时关闭 store fields ,查询语句 指定“stored_fields”: [“none”], 砍掉元数据字段,同时用 “docvalue_fields”: [“video_fact_id”], 指定只拉取需要的字段,降低序列化跟网络传输开销。约能提升40% 性能。

推荐DSL如下:

GET /your_index/_search
 
 
{
 
 
  "query": {
 
 
    "match_all": {} // 或者是其他符合你需求的查询
 
 
  },
 
 
  "stored_fields": ["none"], // 不获取任何存储的字段
 
 
  "docvalue_fields": ["field1", "field2"] // 只获取需要的doc value字段
 
 
}

3、优化后效率

3.1 查询耗时有进一步的提升

3.2 压测时cpu使用率和qps也有了明显的上升

压测最终的指标:优化前1800qps,优化后9200qps。

4、优化根因分析

在优化前,由于Elasticsearch默认从_source字段读取数据,这导致每次查询都需要读取整行数据并进行解压。这个过程不仅耗费CPU资源,还会增加响应时间,特别是当文档内容庞大时。

解压操作是CPU密集型的,而在高负载情况下,这可能成为系统瓶颈,从而限制了查询性能和吞吐量。

优化后,通过指定“stored_fields": ["none"],我们有效地排除了_source字段的读取和解压过程,这显著减少了每个查询的CPU负载。

而使用“docvalue_fields”指定从列存中获取字段内容,没有压缩的转换,进一步减少了数据处理的开销。这种方法不仅降低了CPU的使用率,同时只提取必要的字段也减少了了网络传输的负担。

最终,通过这些优化措施,查询的QPS(每秒查询数)得到了显著提升,从1800qps提高到9200qps,这在高性能应用场景中是一个巨大的飞跃。

更高的QPS意味着系统能够更快地处理更多的查询请求,提高了整体的吞吐量和性能。

5、小结

总结来说,通过精细地调整查询策略和减少不必要的数据处理,我们可以显著提升Elasticsearch的性能,这在处理大规模数据和高并发查询的环境下尤为重要。

6、官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/8.4/search-fields.html#disable-stored-fields

https://www.elastic.co/guide/en/elasticsearch/reference/8.4/search-fields.html#docvalue-fields

5、作者介绍

金多安,Elastic 认证专家,Elastic资深运维工程师,死磕Elasticsearch知识星球嘉宾,星球Top活跃技术专家,搜索客社区日报责任编辑

推荐阅读


更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

比同事抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 缓存 固态存储
优化Elasticsearch 硬件配置
优化Elasticsearch 硬件配置
87 5
|
1月前
|
缓存 监控 安全
Elasticsearch扩展和优化
【11月更文挑战第4天】
47 6
|
2月前
|
存储 自然语言处理 Java
Elasticsearch写入优化
【10月更文挑战第3天】Elasticsearch:从写入原理谈写入优化
106 2
|
1月前
|
存储 缓存 监控
优化Elasticsearch 索引设计
优化Elasticsearch 索引设计
26 5
|
1月前
|
缓存 监控 安全
优化Elasticsearch 集群配置
优化Elasticsearch 集群配置
71 4
|
1月前
|
监控 负载均衡 安全
Elasticsearch集群配置优化
Elasticsearch集群配置优化
34 1
|
1月前
|
存储 缓存 监控
优化 Elasticsearch
优化 Elasticsearch
24 1
|
2月前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
171 3
|
2月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
61 4
|
2月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
62 0