lucene&solr cache在sort、facet等方面的应用解析

       对于cache,Lucene中提两种cache,filter cache和Field cache,lucene的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。如果该field的type是不可以分词tokenized的,则利用该field cache和docidset交集进行梳理统计;如果该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有filter cache,queryResultCache,documentCache,fieldValueCache,这几种cache都是作为SolrIndexSearcher中变量;除了documentCache外,其他都是对documentid的缓存,生命周期和SolrIndexSearcher对象挂钩,采用LRUCache算法对cache的数据进行管理。
        Filter cache存储了fq参数得到的documentId的集合结果,是无序的,在使用过程中和q查询的结果docidSet做交集。除了用fq参数的查询,在solr facet应用中也会使用filter cache,当facet.method=enum时,枚举field的每个term值,封装成fq参数进行查询,返回的结果id和主查询(比如q参数)的docIdSet做交集,进行统计。
       FieldValueCache在前面facet应用中已经介绍了。
      queryResultCache– ordered document ids,是对查询结果的缓存,key的hashcode就是 QueryResultKey(Query query, List<Query> filters, Sort sort, int nc_flags)的成员变量hc,缓存结果为docIdSet,是针对查询条件的完全有序的结构;这个cache对key的命中率要求比较严格,一般是查询条件不太变的场景下使用。
       DocumentCache – stores stored fields,存储docid和document的对应关系,一般很少用。


你可能感兴趣的:(cache,Lucene,Solr)