solr查询优化【转】filtercache-程序员宅基地

技术标签: java  

solr查询优化(实践了一下效果比较明显)

什么是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:

 

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

客户端API调用:

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

Java代码  

使用filterQuery之后的查询代码:

Java代码  

 

经过测试这样优化之后,查询的RT(查询速度)会明显减小,QPS(每秒查询率)会有明显提升。

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

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

Java代码  

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

 

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

Java代码  

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

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

转载于:https://www.cnblogs.com/Lxiaojiang/p/8631404.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30902251/article/details/96658185

智能推荐

JavaScript中Blob对象及示例_res.blob()-程序员宅基地

文章浏览阅读810次。Blob(binary large object)是计算机界通用术语之一,表示二进制大对象。在JavaScript中,Blob通常表示二进制数据,不过,它们不一定非得是大量数据,Blob也可以表示一个小型文本文件的内容_res.blob()

【Greenplum 6.9.0】Greenplum Command Center 6.2安装失败教程_greenplum command center无法下载-程序员宅基地

文章浏览阅读2k次。需要这个?gpperfmon_install --enable --password gpmon --port 5432-bash: gpperfmon_install: command not found直接安装?unzip gpcc.zip报错Failed to connect to database postgres on 127.0.0.1:5432 as gpadmin: libgssapi_krb5.so: cannot open shared object file: No s_greenplum command center无法下载

基于LVDS的高速自同步串行传输系统的研究_lvds总线-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏8次。本文从高速数据传输的需求出发,对高速串行LVDS(Low Voltage Differential Signaling,低压差分信号)接口电路进行研究,重点对其传输方式进行了研究分析。基于SER/DES(Serial/Deserializer,串行/解串器)设计构架下,提出了高速自同步串行传输系统的实现方法。0 引言随着信息技术的日新月异,传统的I/O接口无法满足越来越大的数据处理任务。相对于串行传输技术,采取并行传输技术,提高通道数量就能提高数据传输数率,但是会增加很多成本。而且,并行传输技术中存在_lvds总线

vs2010和Matlab R2012a 混合编程_matlabr2012a怎么运行代码-程序员宅基地

文章浏览阅读1.7k次。转自:http://blog.sina.com.cn/s/blog_4fc6546101011cu5.html本人系统Windows 7旗舰版,32位,采用由m文件构造动态链接库然后在visual studio中调用的方法。1. MATLAB 环境配置: 注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令输入后可能会_matlabr2012a怎么运行代码

分治法之合并排序(2021/1/23)_分治法合并程序-程序员宅基地

文章浏览阅读247次。问题引入代码实现#include<iostream>#include<cstdlib>using namespace std;struct Data{ int flag;};void MergeFunction(struct Data*list,int low,int middle,int high){ //申请辅助空间 int size=high-low; struct Data*space=(struct Data*)malloc(sizeof(struc_分治法合并程序

正规文法构造状态转换图,状态转换图构造正规文法---编译原理_文法状态图-程序员宅基地

文章浏览阅读7.9k次,点赞19次,收藏104次。从左线性正规文法出发,构造状态图注意:增设初态S,单圆圈表示例子从右线性正规文法出发,构造状态图注意:增设终态Z,双圆圈表示例子状态转换图构造左线性正规文法注意:写左线性正规文法时从终态开始例子状态转换图构造右线性正规文法注意:写右线性正规文法时从初态开始例子..._文法状态图

随便推点

sentinel运行原理详解_sentinel原理-程序员宅基地

文章浏览阅读6.6k次,点赞5次,收藏41次。本文基于sentinel-1.8.0版本DegradeSlot:服务降级AuthoritySlot:黑白名单校验,按照字符串匹配,比较简单ClusterBuilderSlot:构建ClusterNode对象,该对象为后面统计QPS、线程数、异常、响应时间等使用。SystemSlot:校验QPS、线程数、系统负载、CPU,按照窗口统计StatisticSlot:统计处理过的请求数和线程数FlowSlot:按照自定义的流控规则检查,这个与StatisticSlot相关NodeSelectorS._sentinel原理

安全多方计算中通用混淆电路估值技术_电路估值密码学-程序员宅基地

文章浏览阅读218次。总序广义上而言SMPC分为两种实现方式,一类是使用布尔电路表述待计算函数,然后使用通用混淆电路来实现安全多方计算。另一类是使用域上的算术电路表述待计算函数,然后使用密码学方法实现安全多方计算。Yao氏混淆电路估值方案该方案可以用于实现对任何类型的门电路的安全估值。Lindell和Pinkas对该方案进行了严格的安全论证,证明该方案在半诚实模型下是安全的。下面简介姚氏混淆电路估值方案。令$C..._电路估值密码学

中文语义匹配_from eval import evaluate-程序员宅基地

文章浏览阅读533次。中文语义匹配_from eval import evaluate

Linux 查看 每个 cpu 的核心数_命令行 为什么查看每个cpu的核数不需要加 wc -l-程序员宅基地

文章浏览阅读3w次。Linux 查看 每个 cpu 的核心数cat /proc/cpuinfo | grep "processor" | grep "0" | wc -l_命令行 为什么查看每个cpu的核数不需要加 wc -l

解决 LINK : fatal error LNK1158: cannot run ‘rc.exe‘_qt cannot run rc.exe-程序员宅基地

文章浏览阅读1k次。问题安装 mmcv时报错 LINK : fatal error LNK1158: cannot run ‘rc.exe’原因这是找不到rc.exe导致问题解决措施在 C:\Program Files (x86)\Windows Kits\8.1\bin\x86 下找到rcdll.dll 和rc.exe复制到VC安装路径中,我的是 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin再次运行,安装成功Looking in inde_qt cannot run rc.exe

WPS宏开发之VBA宏转JS宏_vba转js-程序员宅基地

文章浏览阅读9.2k次,点赞10次,收藏78次。WPS宏开发 VBA宏转JS宏_vba转js

推荐文章

热门文章

相关标签