什么是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:
<query> <filterCache class="solr.LRUCache" size="50000" initialSize="512" autowarmCount="0"/> </query>
这里使用的是solr实现的基于LRU算法的缓实现,以上配置是使用solr.LRUCache ,使用这个cache在插入多,查询少的情况比较使用,如果是查询多,插入少的情况,可以使用solr.FastLRUCache缓存模块。
客户端API调用:
下面是原先的客户端端查询代码:
SolrQuery query = new SolrQuery(); query.setQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123"); QueryResponse response = qyeryServer.query(query);
使用filterQuery之后的查询代码:
SolrQuery query = new SolrQuery(); query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1"); query.setQuery("xxx:123"); QueryResponse response = qyeryServer.query(query);
经过测试这样优化之后,查询的RT会明显减小,QPS会有明显提升。
使用filterquery过程中需要注意点:
●不能在filterQuery 上重复出现query中的查询参数,如果上面的filterquery调用方法如下所示:
query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123"); query.setQuery("xxx:123");
如上,条件xxx:123 在filterQuery和query上都出现了,这样的写法非但起不到查询优化的目的,而且还会增加查询的性能开销。
●尽量减少调用addFilterQuery方法的次数
query.addFilterQuery("status:0 "); query.addFilterQuery("biz_type:1 "); query.addFilterQuery("class_id:1 "); query.setQuery("xxx:123");
如上,将status:0 AND biz_type:1 AND class_id:1 这个组合查询条件,分三次调用filterQuery方法来完成,这样的调用方法虽然是正确的,并且能起到性能优化的效果,优化性能没有调用一次addFilterQuery方法来得高,原因是多调用了两次addFilterQuery,就意味着最后需要多进行两次结果集的求交运算,虽然结果集求交运算速度很快,但毕竟是有性能损耗的。
不过从内存开销的角度来说,调用三次addfilterQuery方法这样可以有效降低内存的使用量,这个是肯定的。所以在是否调用多次addFilterQuery方法的原则是,在内存开销允许的前提下,将量将所有filterQuery条件,通过调用有限次数的addFilterQuery方法来完成。
相关推荐
这些测试结果对于理解和优化 Solr 在实际应用中的性能具有重要的指导意义。在选择 Solr 部署模式时,需要根据具体的业务需求和预期的并发量来权衡单节点和集群的优劣。在需要高性能读写和高可用性的场景下,Solr ...
2. **基于Filter Cache的查询优化**:`filterCache`用于缓存常用的过滤条件。这在实际应用中非常重要,因为它可以显著减少处理过滤器的开销,特别是在频繁使用相同过滤条件的情况下。 #### 总结 Solr中的缓存机制...
- **JVM配置**:Solr运行于Java虚拟机(JVM)之上,合理的JVM配置对提高性能至关重要。例如,设置合理的堆内存大小(`-Xms` 和 `-Xmx` 参数)以确保有足够的内存用于索引和缓存,避免频繁的垃圾回收。 - **HTTP缓存**...
在Solr中,Schema是核心组件之一,它定义了文档的结构和处理方式。`manageschema`功能允许用户通过Web界面动态地修改Schema,而无需直接编辑XML文件,简化了管理和维护过程。在这个"增加了分词器后的配置文件"中,...
### Solr性能优化关键知识点详解 #### 一、理解Solr环境与版本 - **环境配置**:在本文档中,我们关注的是基于Tomcat 6的Solr 3.5版本的部署与优化,这对于初学者来说是一个非常实用且稳定的组合。 - **Solr简介...
随着传统互联网和移动互联网的持续发展,网络带给我们的...目前一些搜索公司在公共互联网领域提供了很好的解决方案,但是企业或者政府机关内部相关信息往往需要应用独立的搜索系统,Solr Cloud则是很好的一个平台选择。
最后,ES的一个不足之处在于文档编写可能不如Solr全面。由于ES和Solr都在快速的发展中,版本更新频繁,用户应该基于自己的需求进行实际测试,来判断哪个产品更适合自己的应用场景。对于ES而言,尽管它提供了很多先进...
solr在做检索的时候时常需要得知他的性能参数,此处使用8G内存,双核处理器测试的结果
"solr性能调优.mht"文件专门针对Solr的性能优化,包括索引优化、硬件配置、查询策略调整等方面,对于追求高效稳定运行的Solr系统来说,这部分内容是必不可少的。 这些文档和资料覆盖了Solr的多个方面,包括入门、...
8. **搜索性能优化**:Solr提供了多种优化手段,包括使用倒排索引、缓存策略、查询优化器等,以提高查询速度和整体性能。 9. **安全与认证**:Solr 8.x引入了内置的安全性框架,包括Zookeeper的ACL和Solr的Role-...
- **性能优化**:Solr团队不断努力提升查询速度和索引效率,8.11.1版本可能包含了一些新的性能优化。 - **新功能**:可能引入了新的搜索特性,比如新的查询语法、更强大的分析器或者对最新技术标准的支持。 - **稳定...
Solr的多种性能优化技巧,如索引的性能优化、缓存的性能 优化、查询的性能优化、JVM和Web容器的优化,以及操作系统级别的优化。 拓展知识中首先讲解了Solr的一些比较生僻的知识点,如伪域、多语种索引支持、安全认证...
Solr-9.0.0是该软件的最新版本,此版本可能包含了一些新的特性和改进,比如性能优化、新的查询语法、更强大的分析器等。 在Solr-9.0.0的压缩包中,通常会包含以下组件: 1. **bin** 文件夹:这个目录下有启动和...
增量更新是Solr的一个关键特性,它允许系统仅处理自上次完整索引以来发生更改的数据,从而提高了性能并降低了资源消耗。"apache-solr-dataimportscheduler.jar" 是一个专门为Solr设计的扩展包,用于实现自动化的数据...
通过深入研究`solr-9.0.0-src.tgz`源码,开发者可以理解Solr的工作原理,定制自己的搜索解决方案,解决特定场景下的性能挑战,并为社区贡献新的功能和优化。同时,这也为学习和研究信息检索、全文搜索、分布式计算等...
2. 引入了新的查询执行模型(Distributed Searcher):优化了分布式查询的性能和稳定性。 3. 增强的CSV处理:支持更大的CSV文件导入,改进了错误处理机制。 4. 优化的内存管理:减少了内存消耗,提高了系统稳定性。 ...
产品逻辑优化经常会容易被忽略,但效果却往往比数据库调优、JVM 调优之类的来的更明显。例如,在 12306 春运抢火车票的场景,由于访问的人多,用户点击“查票”之后系统会非常卡,进度条非常慢,作为用户,我们会...
9. **性能优化**:Solr可以通过调整缓存策略、使用NRT(Near Real Time)索引、优化查询执行计划等方式提高查询速度。 10. **安全与身份验证**:Solr 8.8.2可能包含安全模块,允许设置访问控制列表(ACLs)和角色...
Java 8是Solr 7.x系列支持的最低版本,因为Solr的许多特性和性能优化都是针对Java 8设计的。安装Java 8后,你需要在系统的环境变量中设置`JAVA_HOME`,指向Java安装目录。这一步是必要的,因为Solr启动时会读取此...