30 个 ElasticSearch 调优知识点,都给你整理好了!

第二部分-调优搜索速度


1.filesystem cache越大越好

为了使得搜索速度更快, es严重依赖filesystem cache

一般来说,需要至少一半的 可用内存 作为filesystem cache,这样es可以在物理内存中 保有 索引的热点区域(hot regions of the index)

2.用更好的硬件

搜索一般是I/O bound的,此时,你需要

  • 为filesystem cache分配更多的内存

  • 使用SSD硬盘

  • 使用local storage(不要使用NFS、SMB 等remote filesystem)

  • 亚马逊的 弹性块存储(Elastic Block Storage)也是极好的,当然,和local storage比起来,它还是要慢点

如果你的搜索是 CPU-bound,买好的CPU吧

3.文档模型(document modeling)

文档需要使用合适的类型,从而使得 search-time operations 消耗更少的资源。咋作呢?答:避免 join操作。具体是指

  • nested 会使得查询慢 好几倍

  • parent-child关系 更是使得查询慢几百倍

如果 无需join 能解决问题,则查询速度会快很多

4.预索引 数据

根据“搜索数据最常用的方式”来最优化索引数据的方式

举个例子:所有文档都有price字段,大部分query 在 fixed ranges 上运行 range aggregation。你可以把给定范围的数据 预先索引下。然后,使用 terms aggregation

5.Mappings(能用 keyword 最好了)

数字类型的数据,并不意味着一定非得使用numeric类型的字段。

一般来说,存储标识符的 字段(书号ISBN、或来自数据库的 标识一条记录的 数字),使用keyword更好(integer,long 不好哦,亲)

6.避免运行脚本

一般来说,脚本应该避免。如果他们是绝对需要的,你应该使用painless和expressions引擎。

7.搜索rounded 日期

日期字段上使用now,一般来说不会被缓存。但,rounded date则可以利用上query cache

rounded到分钟等

8.强制merge只读的index

只读的index可以从“merge成 一个单独的 大segment”中收益

9.预热 全局序数(global ordinals)

全局序数 用于 在 keyword字段上 运行 terms aggregations

es不知道 哪些fields 将 用于/不用于 term aggregation,因此 全局序数 在需要时才加载进内存

但,可以在mapping type上,定义 eagerglobalordinals==true,这样,refresh时就会加载 全局序数

10.预热 filesystem cache

机器重启时,filesystem cache就被清空。OS将index的热点区域(hot regions of the index)加载进filesystem cache是需要花费一段时间的。

设置 index.store.preload 可以告知OS 这些文件需要提早加载进入内存

11.使用索引排序来加速连接

索引排序对于以较慢的索引为代价来加快连接速度非常有用。在索引分类文档中阅读更多

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值