文章目录

  • 1 为文件系统cache预留足够的内存
  • 2 使用更快的硬件
  • 3 文档模型
  • 4 预索引数据
  • 5 避免使用脚本
  • 6 优化日期搜索
  • 7 为只读索引执行force-merge
  • 8 预热文件系统cache
  • 9 调节搜索请求中的batched_reduce_size
  • 10 利用自适应副本选择(ARS)提升ES响应速 度

1 为文件系统cache预留足够的内存

    在一般情况下,应用程序的读写都会被操作系统“cache”(除了 direct方式),cache保存在系统物理内存中(线上应该禁用swap),命中 cache可以降低对磁盘的直接访问频率。搜索很依赖对系统 cache 的命中,如果某个请求需要从磁盘读取数据,则一定会产生相对较高的延 迟。应该至少为系统cache预留一半的可用物理内存,更大的内存有更 高的cache命中率。

2 使用更快的硬件

    写入性能对CPU的性能更敏感,而搜索性能在一般情况下更多的是 在于I/O能力

  1. 使用SSD会比旋转类存储介质好得多。
  2. 尽量避免使用 NFS 等远程文件系统,如果 NFS 比本地存储慢3倍,则在搜索场景下响 应速度可能会慢10倍左右。
        这可能是因为搜索请求有更多的随机访问。 如果搜索类型属于计算比较多,则可以考虑使用更快的CPU。

3 文档模型

    为了让搜索时的成本更低,文档应该合理建模。特别是应该避免:

 join操作,嵌套(nested)会使查询慢几倍。父子(parent-child)关系可能使查询慢数百倍。

    因此,如果可以通过非规范化(denormalizing)文 档来回答相同的问题,则可以显著地提高搜索速度。

4 预索引数据

    还可以针对某些查询的模式来优化数据的索引方式。例如,如果所 有文档都有一个 price字段,并且大多数查询在一个固定的范围上运行 range聚合,那么可以通过将范围“pre-indexing”到索引中并使用terms聚 合来加快聚合速度。

5 避免使用脚本

    一般来说,应该避免使用脚本。如果一定要用,则应该优先考虑 painless和expressions。

6 优化日期搜索

    在使用日期范围检索时,使用now的查询通常不能缓存,因为匹配 到的范围一直在变化。但是,从用户体验的角度来看,切换到一个完整的日期通常是可以接受的,这样可以更好地利用查询缓存。

7 为只读索引执行force-merge

    为不再更新的只读索引执行force merge,将Lucene索引合并为单个 分段,可以提升查询速度。当一个Lucene索引存在多个分段时,每个分段会单独执行搜索再将结果合并,将只读索引强制合并为一个Lucene分 段不仅可以优化搜索过程,对索引恢复速度也有好处。
    基于日期进行轮询的索引的旧数据一般都不会再更新。此前的章节 中说过,应该避免持续地写一个固定的索引,直到它巨大无比,而应该 按一定的策略,例如,每天生成一个新的索引,然后用别名关联,或者 使用索引通配符。这样,可以每天选一个时间点对昨天的索引执行 force-merge、Shrink等操作。

8 预热文件系统cache

    如果ES主机重启,则文件系统缓存将为空,此时搜索会比较慢。可 以使用index.store.preload设置,通过指定文件扩展名,显式地告诉操作 系统应该将哪些文件加载到内存中。
    如果文件系统缓存不够大,则无法保存所有数据,那么为太多文件 预加载数据到文件系统缓存中会使搜索速度变慢,应谨慎使用。

9 调节搜索请求中的batched_reduce_size

    该字段是搜索请求中的一个参数。默认情况下,聚合操作在协调节 点需要等所有的分片都取回结果后才执行,使用 batched_reduce_size 参 数可以不等待全部分片返回结果,而是在指定数量的分片返回结果之后 就可以先处理一部分(reduce)。这样可以避免协调节点在等待全部结 果的过程中占用大量内存,避免极端情况下可能导致的OOM。该字段 的默认值为512,从ES 5.4开始支持。

10 利用自适应副本选择(ARS)提升ES响应速 度

    为了充分利用计算资源和负载均衡,协调节点将搜索请求轮询转发 到分片的每个副本,轮询策略是负载均衡过程中最简单的策略,任何一 个负载均衡器都具备这种基础的策略,缺点是不考虑后端实际系统压力 和健康水平。
    例如,一个分片的三个副本分布在三个节点上,其中Node2可能因 为长时间GC、磁盘I/O过高、网络带宽跑满等原因处于忙碌状态,如下图所示。

如果搜索请求被转发到副本2,则会看到相对于其他分片来说,副 本2有更高的延迟。 · 分片副本1:100ms。
· 分片副本2(degraded):1350ms。
· 分片副本3:150ms。
由于副本2的高延迟,使得整个搜索请求产生长尾效应。
    ES希望这个过程足够智能,能够将请求路由到其他数据副本,直到 该节点恢复到足以处理更多搜索请求的程度。在ES中,此过程称为“自 适应副本选择”。
    ES的ARS实现基于这样一个设定:对每个搜索请求,将分片的每个 副本进行排序,以确定哪个最可能是转发请求的“最佳”副本。与轮询方 式向分片的每个副本发送请求不同,ES选择“最佳”副本并将请求路由到那里。

死磕elasticsearch(七)搜索速度优化相关推荐

  1. Elasticsearch优化——搜索速度优化

    Elasticsearch优化--搜索速度优化 文章目录 Elasticsearch优化--搜索速度优化 1. 为文件系统cache预留足够的内存 2. 使用更快的硬件 3. 文档模型 4. 预索引数 ...

  2. ElasticSearch(七) 搜索

    title: ElasticSearch(七) 搜索 tags: ElasticSearch author: Clown95 搜索 在前面,已经介绍了在ElasticSearch索引中处理数据的基础知 ...

  3. Elasricsearch搜索速度优化

    Elasricsearch搜索速度优化 1.合理设置副本数量 增加副本,可以提升搜索的能力. 如果副本设置过多,会对服务器造成额外的压力,因为主分片需要给所有副本同步数据.另外,副本过多也会占用磁盘空 ...

  4. 如何系统学习ElasticSearch、Kibana、Logstash:死磕 Elasticsearch 方法论(初学者必看)

    目录 一.ELK Stack 的应用场景 场景一:使用 ES 作为业务系统的后端. 场景二:在原有系统中增加 ES.Logstash.Kibana等. 场景三:使用 ELK Stack 结合现有工具对 ...

  5. 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招!

    人工智能.大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需.Elasticsearch 作为开源领域的后起之秀,从 2010 年至今得到飞跃式的发展.Elasticsear ...

  6. Elasticsearch 异步搜索 Async search 实战

    1.Elasticsearch 异步搜索定义 异步搜索 API 可异步执行搜索请求.监控其进度并检索可用的部分结果. 如下的官方介绍动画,能更加生动的介绍清楚异步检索. 传统检索 VS 异步检索,在数 ...

  7. elasticsearch 生产级别深度优化

    这是一篇转自别人的文章,真的讲的很详细.已经读了很多遍,分享给大家. 贴上原文地址(原文将了很多内容,这是优化方面摘取出来的):https://www.cnblogs.com/kevingrace/p ...

  8. 总是搜不到想要的内容?Elasticsearch搜索排名优化了解一下

    导语 | Elasticsearch(下文简称ES) 是当前热门的开源全文搜索引擎,利用它我们可以方便快捷搭建出搜索平台,但通用的配置还需要根据平台内容的具体情况做进一步优化,才能产生令用户满意的搜索 ...

  9. 【Elasticsearch】es 提高 搜索速度

    1.概述 官网:Tune for search speededit 将内存分配给文件系统缓存 Elasticsearch严重依赖于文件系统缓存,以加快搜索速度.通常,您应该确保至少有一半的可用内存分配 ...

最新文章

  1. AI学习与进阶实践-基于行业价值的AI学习与进阶路径
  2. lcx转发3389数据
  3. 本机不装Oracle,使用plsql连接远程Oracle的方法
  4. python学习------面向对象进阶
  5. Java实现 LeetCode 75 颜色分类
  6. 蓝牙耳机哪个牌子好?国庆出游蓝牙耳机推荐
  7. 感恩母亲节主题活动照片作品征集小程序
  8. 提高电脑速度的超多方法。
  9. 我的眼眸,等你路过我的容颜
  10. Gmail配置邮箱客户端
  11. Delphi: RTTI与ini配置文件
  12. 覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
  13. 什么是SPOOLing?
  14. 互联网校招研发薪资汇总
  15. Java开发人员必知必会的20种常用类库和API
  16. 潍坊风尚米兰能耗监测系统的应用-安科瑞耿敏花
  17. MySQL迁移到kdb_Q语言把mysql输入导入到KDB+数据库
  18. 使用Sandcastle 基于代码注释生成接口文档
  19. DNSPod十问陆婷婷:什么是创造101背后的破圈秘诀?
  20. 2020 Android 大厂面试-插件化、模块化、组件化,移动开发工程师的岗位职责

热门文章

  1. 【面试】网易游戏面试题目整理及答案(1)
  2. mysql-5.7.42 安装教程
  3. SFML学习-写一个俄罗斯方块
  4. PHP v7入门,windows环境配置,Hello World!
  5. 快速取消合并单元格并自动填充(含空值)
  6. 220817-3Dslicer配准学习记录
  7. the plural (复数)
  8. 风华是一指流砂,苍老了一段年华
  9. 微信小程序for循环遍历数组解决办法
  10. javacv实现直播流