Coin163

solr cache介绍

2015-06-27by admin, 次阅读
      Lucene中主要有两种cache,Filter cache和Field cache。
           Filter cache的实现类为CachingWrapperFilter,用来缓存其他lucene Filter的查询结果。
           Field cache应用的最为广泛,广泛应用于排序sort、分组统计facet中。简单来说,它存储某个field的所有文档id和该field中的term的对应关系,和倒排索引不同,是正向的信息。
     在solr sort by field排序场景中,可以在查询出来的docIdSet的基础上,从field cache中查询相关的field值进行排序,其中sort的前提是需要对该field字段进行索引,并且该field字段不可以进行分词。
     同样在 solr的分组facet场景中,可以根据field所有document的term数量来考虑分组的方式,如果指定facet.method=fc,则表示term的数量比较大,难以枚举,那么此时会根据field的type来考虑是否利用field cache。
        1)如果该field的type是不可以分词tokenized的,则利用该field cache和docidset交集进行梳理统计;
        2)如果该field的type是可以分词tokenized的,那么会利用fieldValueCache,cache的key是facet.field的值,value是UnInvertedField,UnInvertedField保存了该field中每个Term,以及term在每个document上该field的频率,保存在一个数组中,类似于term1在doc[1]中的频率为2等等,这样结合查询返回的docIdSet取交集,计算field中term的频率。

     在facet应用中,一般field设置为是不分词的,这样实际上统计的是field value的出现的频率。

     Solr中的cache有:FilterCache,queryResultCache,documentCache,FieldCache,FieldValueCache,perSegFilter,这几种cache都是作为SolrIndexSearcher中变量;除了documentCache外,其他都是对documentid的缓存,生命周期和SolrIndexSearcher对象挂钩,采用LRUCache算法对cache的数据进行管理。如下图(solr 4.10):


solr-cache   
    1)Filter cache存储了fq参数得到的documentId的集合结果,是无序的,在使用过程中和q查询的结果docidSet做交集。除了用fq参数的查询,在solr facet应用中也会使用filter cache,当facet.method=enum时,枚举field的每个term值,封装成fq参数进行查询,返回的结果id和主查询(比如q参数)的docIdSet做交集,进行统计。
    2)FieldValueCache在前面facet应用中已经介绍了。
    3)queryResultCache– ordered document ids,是对查询结果的缓存,key的hashcode就是 QueryResultKey(Query query, List<Query> filters, Sort sort, int nc_flags)的成员变量hc,缓存结果为docIdSet,是针对查询条件的完全有序的结构;这个cache对key的命中率要求比较严格,一般是查询条件不太变的场景下使用。       
    4)DocumentCache – stores stored fields,存储docid和document的对应关系,一般很少用。 


      
------分隔线----------------------------