如何提高elasticsearch的查询速度

本文针对ES在大数据量下的性能瓶颈,提出了一系列优化策略,包括硬件升级、JVM参数调优、减少副本数量、禁止深度分页等,旨在提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES性能并非想像中的那么好

ES数据量一大时,特别是第一次搜索的时候耗时会很久(甚至10s以上)。也不要认为改个参数就能改善所有性能慢的场景。

通过ES慢日志可分析查询效率

ES提供了慢日志,但默认是没有开启的。ES中的慢日志主要分两类:索引慢日志、搜索慢日志。如何开启呢?参考如下:

PUT /my_index/_settings

{

"index.search.slowlog.threshold.query.warn" : "10s",

"index.search.slowlog.threshold.fetch.debug": "500ms",

"index.indexing.slowlog.threshold.index.info": "5s"

}

ES查询性能优化方案

1、升级硬件配置(硬盘、内存)

对于硬盘建议选用SSD,它比机械硬盘读写速度更快,另外内存需要适时调整。

2、JVM参数调优

要知道ES是用Java开发的,跑在JVM中,如果JVM参数设置不当也会影响ES的性能!ES安装后默认的堆内存是1G,这个值太小了,需要适当调大。

3、加大文件系统缓存设置

ES依懒底层的FileSystem Cache,文件系统缓存值若太小则会导致ES查询时会从硬盘中查询,效率低。若文件系统缓存大小设置合理,则很多查询可以直接从缓存内查询。

4、减少副本数量

ES默认副本是3个,副本越多虽然能提高集群的可用性,但是也增加了搜索的并发数、也会影响索引写入效率。所以建议副本不要过多,一般1~3个足够了。

5、禁止深度分页

ES它的分页效率很低(若每页10条,查询第100页时,ES实际查询的是每个Shard中的1000条数据进行处理后再返回第100页里的10条数据),页数越靠后,CPU消耗越大,查询效率越低!所以我们要禁止深度分页。

6、Filter 比 Query 效率好

Filter查询结果可以缓存,而且不需要像Query那样计算相关性分值,所以Filter效率更高。

 

7,服务器内存要大一点,因为索引加载需要大量内存,并且最大最小内存设置相同值,防止GC时候的大量stop the world!

8,设置合理的索引刷新时间,indwx.fresh_interval如果设置过大,索引查不到容易导致异常,设置太小,服务器压力会很大!

9,禁用_all,打开会导致拷贝增加,查询效率变低!

10,防止设置过多的分片副本,增大合并时间,影响查询效率!

11,优化查询返回字段,减少内存占用!

12,添加查询缓存!

### 如何优化Elasticsearch查询速度的最佳实践和技巧 #### 1. 合理规划索引结构 为了提升查询效率,应当精心设计文档映射(mapping),确保字段类型定义准确无误。对于不需要存储原始数据的情况,可以关闭_source选项来减少资源占用[^2]。 #### 2. 使用合适的分片数量 过多或过少的分片都会影响到系统的整体表现。通常建议每个节点上的主分片数不超过20个,并保持一定的冗余度以增强容错能力。当预计未来会有大量增长时,提前预留足够的分片数目也是明智之举[^3]。 #### 3. 调整JVM堆大小 适当调整Java虚拟机(JVM)的最大堆尺寸有助于改善垃圾回收(GC)频率及其带来的延迟问题。一般而言,将最大堆设为物理RAM的一半是比较合理的做法;同时也要注意最小堆不宜过大以免造成频繁GC事件的发生。 #### 4. 应用过滤器而非查询条件 如果某些筛选逻辑不会改变结果集,则应尽可能采用filter上下文中的bool query子句执行此操作。因为这类请求会被缓存起来供后续重用,从而加快响应时间并降低CPU消耗[^1]。 #### 5. 实施批量处理机制 对于大批量写入操作来说,使用bulk API代替单条目提交方式能显著缩短事务完成周期。同样,在读取多份记录的时候也可以考虑运用scroll scroll API获取更大范围内的匹配项列表。 ```json POST /_bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "create" : { "_index" : "test", "_id" : "2" } } { "field1" : "value2" } ... ``` #### 6. 缩短刷新间隔(refresh_interval) 默认情况下每隔一秒就会触发一次自动刷新动作,这虽然保证了近实时性的特性但也增加了I/O负担。因此可以根据实际需求灵活设定更长的时间窗口或者干脆手动控制刷新时机。 #### 7. 关闭不必要的功能模块 停用那些不打算使用的插件和服务组件(比如river),这样不仅节省计算资源而且还能简化运维管理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值