关于es的缓存

本人在使用es查询的时候第一次用时46ms,连续第二次仅用了4ms,不由得想起了缓存,经查询资料得知:

es有三种缓存:分别是query,fielddata和request

      1、query cache

          也称filter cache,作用是对一个查询中包含的过滤器执行结果进行缓存,满足了term, range过滤器的clause会被缓存(5.1.1版本term被取消了),bool不会被缓存,但是bool过滤器包含的子term会被缓存。

       2、request cache

           当一个查询发送到es cluster的某个节点上时,这个节点会把该查询扩散分发到其余节点,并在相应分片上执行,将分片上执行的结果成为“本地结果集”。这些本地结果集最终会汇集到最初请求到达的那个协调节点,这些“分片级”的“本地结果集”会合并成“全局结果集“。query-and-fetch里面的query过程。request cache就是缓存这些”分片级本地结果集“的。但是request cache在每次refresh_interval后就会被清空,所以其生命周期是一个refresh_interval(默认是1秒)。

      3、 fielddata cache 

        field data与doc_values作用一样,都是让我们在inverted index倒排索引的基础上做aggregation统计、sort排序。
当第一次在analyzed字段(只有analyzed字段使用fielddata,其余使用doc_values)上进行agg、sort或通过脚本访问时,就会触发该字段fielddata cache的加载,这种缓存的“segment”级别的,但有新的segment打开时,旧的缓存不会重新加载,而是直接把新的segment对应的fielddata cache加载到内存。一个fielddata被加载,那么在fielddata cache对应的segment生命周期范围内都会驻留在内存中。也即,当段合并时会触发合并后更大段的fielddata cache加载。

你可能感兴趣的:(es)