分片查询缓存(Shard Request Cache)
ES 层面的缓存实现,封装在 IndicesRequestCache 类中。缓存的 Key 是整个客户端请求,缓存内容为单个分片的查询结果。主要作用是对聚合的缓存,查询结果中被缓存的内容主要包括:Aggregations(聚合结果)、Hits.total、以及 Suggestions等。
并非所有的分片级查询都会被缓存。只有客户端查询请求中 size=0 的情况下才会被缓存。其他不被缓存的条件还包括 Scroll、设置了 Profile 属性,查询类型不是 QUERY_THEN_FETCH,以及设置了 requestCache=false 等。另外一些存在不确定性的查询例如:范围查询带有 Now,由于它是毫秒级别的,缓存下来没有意义,类似的还有在脚本查询中使用了 Math.random() 等函数的查询也不会进行缓存。
当有新的 Segment 写入到分片后,缓存会失效,因为之前的缓存结果已经无法代表整个分片的查询结果。所以分片每次 Refresh 之后,缓存会被清除。
节点查询缓存/过滤器缓存(Node Query Cache /Filter Cache)
Lucene 层面的缓存实现,封装在 LRUQueryCache 类中,默认开启。缓存的是某个 Filter 子查询语句在一个 Segment 上的查询结果。