对于频繁的查询,查询结果缓存是提高效率的有效做法。
ElasticSearch缓存分为node缓存与index缓存;
其中node缓存:
1.query缓存(是属于lucene的)
2.field缓存
3.request缓存
以下分析一下QueryCache;
QueryCache是主要dsl的子查询语句的结果集缓存,对于后续相同的查询可以直接取缓存数据
以上是核心三种缓存的源代码
本集群query_cache情况:
总缓存量960.18M
命中率:0.06, 非常低
场景分析原因:现阶段的大多数查询都是带上秒级别的时间查询,所以导致大量缓存失效,而且数据实时存储segment不断合并,也会导致缓存不断失效。缓存利用率非常低,即使加大indices.queries.cache.count与indices.queries.cache.size也效果不明显,过大反而会容易OOM。
缓存实现流程:
IndicesQueryCache ---> LRUQueryCache ---> QueryCachingPolicy 其中UsageTrackingQueryCachingPolicy实现了QueryCachingPolicy接口
IndicesQueryCache 会使用最近使用算法的LRUQueryCache与QueryCachingPolicy 去具体实现缓存细节。
接下来分析UsageTrackingQueryCachingPolicy的缓存策略:
isCostly方法的作用:判断是否是复杂的查询,一般并联的都是复杂查询
shouldNeverCache方法的作用:应该是不缓存的查询,比如说term查询,MatchAllDocs查询,etc.
minFrequencyToCache 方法中,对于高昂查询语句,查询两次就缓存进入缓存。一般查询5次将进入缓存,对于BooleanQuery与DisjunctionMaxQuery这两个查询4次保存缓存。