`
san_yun
  • 浏览: 2669478 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Solr性能优化之filterCache

 
阅读更多

原文:Solr性能优化之filterCache

什么是filtercache?

    solr应用中为了提高查询速度有可以利用几种cache来优化查询速度,分别是fieldValueCache,queryResultCache,documentCache,filtercache,在日常使用中最为立竿见影,最有效的应属filtercache,何谓filtercache?这个需要从一段solr的查询日志开始说起,下面是我截取的solr运行中打印的一段查询日志:

[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 2                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A411%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 2                  
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 2                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A8059%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 0                 
[search4alive-0] Request_is ==> debugQuery=on&group=true&group.field=group_id&group.ngroups=true&group.sort=gmt_create+desc&q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+ha
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=30&rows=30,queryTime_is ==> 4                                    
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A375%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 3                  
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 4                                     
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 4                                     
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 3                                     

   看到这段查询日志之后,我们开始考虑如何提升查询的rt(查询速度),因为在参数q中的查询是要有磁盘IO开销的,很自然的思路是将整个查询的参数q作为key,对应的结果作为value,这样做是可以的,但是查询的命中率会很低,会占用大量内存空间。

   查询参数q上基本上每次都会出现status,biz_type,class_id 对于这样的字查询,所以可以把整个查询条件分成两部分一部分是以status,biz_type,class_id 这几个条件组成的子查询条件,另外一部分是除这三个条件之外的子查询。在进程查询的时候,先将status,biz_type,class_id 条件组成的条件作为key,对应的结果作为value进行缓存,然后再和另外一部分查询的结果进行求交运算。

 

  

       通过上面这幅图明白了filtercache的意义是,将原先一个普通查询分割成两个组合查询的与运算,两个子查询至少有一个使用缓存,这样既减少了查询过程的IO操作,又控制了缓存的容量不会消耗过多的内存。

如何使用?

首先要配置solrconfig.xml 要开启fltercache:

 

Xml代码   收藏代码
  1. <query>  
  2.         <filterCache    class="solr.LRUCache"     size="50000"      initialSize="512"      autowarmCount="0"/>  
  3. </query>  

 这里使用的是solr实现的基于LRU算法的缓实现,以上配置是使用solr.LRUCache ,使用这个cache在插入多,查询少的情况比较使用,如果是查询多,插入少的情况,可以使用solr.FastLRUCache缓存模块。

 

 

客户端API调用:

下面是原先的客户端端查询代码:

 

Java代码   收藏代码
  1. SolrQuery query = new SolrQuery();  
  2.   
  3. query.setQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123");  
  4.   
  5. QueryResponse response = qyeryServer.query(query);  

 

 

使用filterQuery之后的查询代码:

 

Java代码   收藏代码
  1. SolrQuery query = new SolrQuery();  
  2.   
  3. query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1");  
  4. query.setQuery("xxx:123");  
  5.   
  6. QueryResponse response = qyeryServer.query(query);  

 

经过测试这样优化之后,查询的RT会明显减小,QPS会有明显提升。

 

使用filterquery过程中需要注意点:

 

●不能在filterQuery 上重复出现query中的查询参数,如果上面的filterquery调用方法如下所示:

 

Java代码   收藏代码
  1. query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123");  
  2. query.setQuery("xxx:123");  

 如上,条件xxx:123 在filterQuery和query上都出现了,这样的写法非但起不到查询优化的目的,而且还会增加查询的性能开销。

 

●尽量减少调用addFilterQuery方法的次数

Java代码   收藏代码
  1. query.addFilterQuery("status:0 ");  
  2. query.addFilterQuery("biz_type:1 ");  
  3. query.addFilterQuery("class_id:1 ");  
  4. query.setQuery("xxx:123");  

如上,将status:0 AND biz_type:1 AND class_id:1 这个组合查询条件,分三次调用filterQuery方法来完成,这样的调用方法虽然是正确的,并且能起到性能优化的效果,优化性能没有调用一次addFilterQuery方法来得高,原因是多调用了两次addFilterQuery,就意味着最后需要多进行两次结果集的求交运算,虽然结果集求交运算速度很快,但毕竟是有性能损耗的。

 

不过从内存开销的角度来说,调用三次addfilterQuery方法这样可以有效降低内存的使用量,这个是肯定的。所以在是否调用多次addFilterQuery方法的原则是,在内存开销允许的前提下,将量将所有filterQuery条件,通过调用有限次数的addFilterQuery方法来完成。

 

分享到:
评论

相关推荐

    solr中cache综述

    2. **基于Filter Cache的查询优化**:`filterCache`用于缓存常用的过滤条件。这在实际应用中非常重要,因为它可以显著减少处理过滤器的开销,特别是在频繁使用相同过滤条件的情况下。 #### 总结 Solr中的缓存机制...

    高效的企业级搜索引擎Solr

    #### 二、Solr的性能优化策略 为了进一步提升Solr的性能,通常会采用多级缓存策略来增强其搜索和并发处理能力。 ##### 1. SolrCache缓存 - **LRUCache**:采用了最近最少使用的策略来管理缓存中的数据,当缓存...

    solr cache部分 中文解释

    在优化 Solr 性能时,正确地管理和调整缓存配置至关重要。这可能涉及到监控缓存命中率、查看缓存大小、分析查询模式,以及根据工作负载调整缓存策略。在某些情况下,过度依赖缓存可能会导致内存压力增加,反而影响...

    solr基础知识介绍

    Solr的缓存机制包括filterCache、queryResultCache和documentCache,它们分别用于优化过滤器、查询结果和文档的缓存操作。文档还提供了一个关于SolrJ的介绍,SolrJ是Solr的Java客户端,它支持与Solr服务器的交互。...

    Lucene项目源码

    `FilterCache`和`TermQueryCache`等缓存策略优化了查询速度。 7. **多线程与并发** Lucene在设计时考虑了多线程环境,`IndexWriter`支持并发写入,`IndexReader`允许多个读取者共享一个索引。理解其并发控制机制有...

    Lucene视频教程_讲解部分源码

    同时,通过设置不同类型的Filter和FilterCache,可以进一步优化倒排索引的访问。 6. **实时搜索与更新**:Lucene支持实时索引,即在添加或修改文档后无需重新构建整个索引,即可进行搜索。这通过In-memory缓冲和段...

    LUCENE索引搜索数据库技术汇总

    4. **优化与性能** - **合并段(Merge Segments)**: `IndexWriter`会在索引中创建多个段,定期合并小段可以提高搜索效率。 - **缓存(Cache)**: 使用`BitSet`缓存和`FilterCache`可以加快查询速度,特别是对于...

    全文检索(Lucene)详解

    - **内存缓存**: 利用缓存技术提高搜索性能,如使用FilterCache存储过滤器结果,TermQueryCache存储常见查询结果。 - **实时索引**: 利用近实时搜索机制,更新索引后短时间内即可搜索到新添加的文档。 6. **应用...

Global site tag (gtag.js) - Google Analytics