第二部分-调优搜索速度
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.使用索引排序来加速连接
索引排序对于以较慢的索引为代价来加快连接速度非常有用。在索引分类文档中阅读更多