es的三种缓存

https://www.elastic.co/guide/en/elasticsearch/reference/6.3/indices-clearcache.html

image

三种cache

query cache

也称filter cache,作用是对一个查询中包含的过滤器执行结果进行缓存,满足了term, range过滤器的clause会被缓存(5.1.1版本term被取消了),bool不会被缓存,但是bool过滤器包含的子term会被缓存。 curl "http://$HOST/_nodes/stats/indices/query_cache,request_cache,fielddata?pretty&human"

request cache

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

  • 其缓存key是这个查询的DSL语句。所以如果要命中缓存查询生成的DSL一定要一样,这里的一样是指DSL这个字符串一样。

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加载。

Reference