`
haiziwoainixx
  • 浏览: 409614 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Solr缓存介绍

阅读更多

 

转自:http://www.blogjava.net/conans/articles/380684.html

本文将介绍Solr查询中涉及到的Cache使用及相关的实现。Solr查询的核心类就是SolrIndexSearcher,

每个core通常在 同一时刻只由当前的SolrIndexSearcher供上层的handler使用

(当切换SolrIndexSearcher时可能会有两个同时提供服务),而Solr的各种Cache是依附于SolrIndexSearcher的,SolrIndexSearcher在则Cache 生,SolrIndexSearcher亡则Cache被清空close掉。

Solr中的应用Cache有filterCache、 queryResultCache、documentCache等,这些Cache都是SolrCache的实现类,

并且是 SolrIndexSearcher的成员变量,各自有着不同的逻辑和使命,下面分别予以介绍和分析。

1、SolrCache接口实现类

Solr提供了两种SolrCache接口实现类:solr.search.LRUCache和solr.search.FastLRUCache。

FastLRUCache是1.4版本中引入的,其速度在普遍意义上要比LRUCache更fast些。

1.1、solr.search.LRUCache

LRUCache可配置参数如下:

1)size:cache中可保存的最大的项数,默认是1024
2)initialSize:cache初始化时的大小,默认是1024。
3)autowarmCount:
当切换SolrIndexSearcher时,可以对新生成的SolrIndexSearcher做autowarm(预热)处理。
autowarmCount表示从旧的SolrIndexSearcher中取多少项来在新的SolrIndexSearcher中被重新生成,

如何重新生成由CacheRegenerator实现。在当前的1.4版本的Solr中,这个autowarmCount只能取预热的项数,

将来的4.0版本可以指定为已有cache项数的百分比,以便能更好的平衡autowarm的开销及效果。

如果不指定该参数,则表示不做autowarm处理。实现上,LRUCache直接使用LinkedHashMap来缓存数据,

由initialSize来限定cache的大小,淘汰策略也是使用LinkedHashMap的内置的LRU方式,

读写操作都是对map的全局锁,所以并发性效果方面稍差。

1.2、solr.search.FastLRUCache

在配置方面,FastLRUCache除了需要LRUCache的参数,还可有选择性的指定下面的参数:

1)minSize:当cache达到它的最大数,淘汰策略使其降到minSize大小,默认是0.9*size。
2)acceptableSize:当淘汰数据时,期望能降到minSize,但可能会做不到,则可勉为其难的降到acceptableSize,

默认是0.95*size。

3)cleanupThread:相比LRUCache是在put操作中同步进行淘汰工作,FastLRUCache可选择由独立的线程来做,

也就是配置cleanupThread的时候。当cache大小很大时,每一次的淘汰数据就可能会花费较长时间,

这对于提供查询请求的线程来说就不太合适,由独立的后台线程来做就很有必要。实现上,

FastLRUCache内部使用了ConcurrentLRUCache来缓存数据,它是个加了LRU淘汰策略的ConcurrentHashMap,

所以其并发性要好很多,这也是多数Java版Cache的极典型实现。

2、filterCache

filterCache存储了无序的lucene document id集合,该cache有3种用途:

1)filterCache
存储了filter queries(“fq”参数)得到的document id集合结果。Solr中的query参数有两种,即q和fq。如果fq存在,

Solr是先查询fq(因为fq可以多个,所以多个fq查询是个取结果交集 的过程),之后将fq结果和q结果取并。

在这一过程中,filterCache就是key为单个fq(类型为Query),value为documentid集合(类型为DocSet)的cache。

对于fq为range query来说,filterCache表现出其有价值的一面。
2)filterCache
还可用于facet查询(http://wiki.apache.org/solr/SolrFacetingOverview),facet查询中各
facet的计数是通过对满足query条件的document
id集合(可涉及到filterCache)的处理得到的。因为统计各facet计数可能会涉及到所有的doc
id,所以filterCache的大小需要能容下索引的文档数。
3)如果solfconfig.xml中配置了<useFilterForSortedQuery/>,

那么如果查询有filter(此filter是一需要过滤的DocSet,而不是fq,我未见得它有什么用),

则使用filterCache。

 

对于是否使用filterCache及如何配置filterCache大小,需要根据应用特点、统计、效果、经验等各方面来评估。

对于使用fq、facet的应用,对filterCache的调优是很有必要的。

4)客户端使用

使用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调用方法如下所示:

 

  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方法的次数

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方法来完成。

 

 

3、queryResultCache

顾名思义,queryResultCache是对查询结果的缓存(SolrIndexSearcher中的cache缓存的都是document id set),
这个结果就是针对查询条件的完全有序的结果。 
因为查询参数是有start和rows的,所以某个QueryResultKey可能命中了cache,但start和rows却不在cache的
document id set范围内。当然,document id
set是越大命中的概率越大,但这也会很浪费内存,这就需要个参数:queryResultWindowSize来指定document id set的大小。
<queryResultWindowSize>50</queryResultWindowSize>
相比filterCache来说,queryResultCache内存使用上要更少一些,但它的效果如何就很难说。
就索引数据来说,通常我们只是在索引上存储应用主键id,再从数据库等数据源获取其他需要的字段。
这使得查询过程变成,首先通过solr得到document id set,再由Solr得到应用id集合,
最后从外部数据源得到完成的查询结果。如果对查询结果正确性没有苛刻的要求,可以在Solr之外独立的缓存完整的
 
查询结果(定时作废),这时queryResultCache就不是很有必要,否则可以考虑使用queryResultCache。当然,如果发现在
queryResultCache生命周期内,query重合度很低,也不是很有必要开着它。 

 

4、documentCache

又顾名思义,documentCache用来保存<doc_id,document>对的。如果使用documentCache,就尽可能开大

 

些,至少要大过<max_results> *<max_concurrent_queries>,否则因为cache的淘汰,

一次请求期间还需要重新获取document一次。也要注意document中存储的字段的多少,避免大量的内存消耗。

5、User/Generic Caches 

Solr支持自定义Cache,只需要实现自定义的regenerator即可

6、The Lucene FieldCache 

lucene中有相对低级别的FieldCache,Solr并不对它做管理,所以,lucene的FieldCache还是由lucene的IndexSearcher来搞。 

7、autowarm

上面有提到autowarm,autowarm触发的时机有两个,一个是创建第一个Searcher时(firstSearcher),一个是创建个新

 

Searcher(newSearcher)来代替当前的Searcher。在Searcher提供请求服务前,Searcher中的各个Cache可以

做warm处理,处理的地方通常是SolrCache的init方法,而不同cache的warm策略也不一样。

1)filterCache:filterCache注册了下面的CacheRegenerator,就是由旧的key查询索引得到新值put到新cache中。

 2)queryResultCache:queryResultCache的autowarm不在SolrCache的init(也就是说,不是去遍历已

 有的queryResultCache中的query key执行查询),而是通过SolrEventListener接口的void

newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher

currentSearcher)方法,来执行配置中特定的query查询,达到显示的预热lucene FieldCache的效果。

3)documentCache:因为新索引的document id和索引文档的对应关系发生变化,所以documentCache没有warm的过程,

落得白茫茫一片真干净。尽管autowarm很好,也要注意autowarm带来的开销,这需要在实际中检验其warm的开销,

也要注意Searcher的切换频率,避免因为warm和切换影响Searcher提供正常的查询服务。

 

 

 

分享到:
评论

相关推荐

    solr基础知识介绍

    6.Solr缓存 18 6.1 filterCache 18 6.2 queryResultCache 18 6.3 documentCache 19 7.solrj wiki 19 7.1 SolrJ/Solr cross-version compatibility 19 7.2 Setting the classpath 20 7.2.1 Maven 20 7.3 ...

    solr更换memcached缓存的方法

    NULL 博文链接:https://gcgmh.iteye.com/blog/434772

    java进阶Solr从基础到实战

    视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 Solr它是一种开放源码的...4.Solr缓存 5.Spring Data Solr 章节五:综合案例,电商网站搜索页面 1.关键字搜索 2.搜索面板展示 3.分页 4.排序 5.高亮

    已编译版本solr-8.11.2.tgz

    他的主要特性包括:高效,灵活的缓存功能,垂直搜索功能,高亮下试搜索结果,通过索引复制来提高可用性,提供一套强大的data schema 来定义字段,类型和设置文本分析,提供基于web的管理界面等。

    solr4.4版本

    solr4.4版本,解压后可以放于tomcat下运行,可以配置数据库连接及SQL语句,将查询结果放在solr中缓存,项目直接操作solr,可以配置定时任务(PS:定时任务只支持到4.4版本,以后版本目前没有)solr作为数据库和项目...

    SOLR的应用教程

    1.2 Solr的特性 4 1.2.1 Solr使用Lucene并且进行了扩展 4 1.2.2 Schema(模式) 5 1.2.3 查询 5 1.2.4 核心 5 1.2.5 缓存 5 1.2.6 复制 6 1.2.7 管理接口 6 1.3 Solr服务原理 6 1.3.1 索引 6 1.3.2 搜索 7 1.4 源码...

    Solr权威指南-上卷

    Solr的多种性能优化技巧,如索引的性能优化、缓存的性能 优化、查询的性能优化、JVM和Web容器的优化,以及操作系统级别的优化。 拓展知识中首先讲解了Solr的一些比较生僻的知识点,如伪域、多语种索引支持、安全认证...

    solr 企业搜索引擎教程

    定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一 个描述所有 Field 及其内容的 XML 文档就可以了。定制搜索的时候只需要发送 HTTP GET 请求 即可,然后对 Solr 返回的信息进行重新布局,以产生利于...

    Solr权威指南-下卷

    Solr的多种性能优化技巧,如索引的性能优化、缓存的性能 优化、查询的性能优化、JVM和Web容器的优化,以及操作系统级别的优化。 拓展知识中首先讲解了Solr的一些比较生僻的知识点,如伪域、多语种索引支持、安全认证...

    springboot整合redis集群、freemarker模板和多索引库solr,同时将redis集群作mybatis的二级缓存

    springboot整合redis集群和多索引库solr,同时将redis集群作mybatis的二级缓存源代码

    solr-7.0.0

    solr服务器,可搭建集群模式,单片按装直接点击启动。

    商城后台项目,采用分布式系统架构,SSM+Maven构建,Nginx反向代理,Redis缓存,Solr搜索服.zip

    商城后台项目,采用分布式系统架构,SSM+Maven构建,Nginx反向代理,Redis缓存,Solr搜索服-HiShop

    高性能的Apach Solr 4

    本参考书介绍如何使用apache solr 4搭建高性能的搜索系统,从文档缓存、过滤缓存、查询结果缓存、查询结果页面缓存、利用Zookeeper搭建 SolrCloud分布式集群环境等方面来进行搜索引擎性能优化。

    apache solr1.3.0所有最新开发包及源码及文档

    Solr是一个基于Lucene Java搜索库的开源企业搜索服务器,拥有XML/HTTP和JSON APIs,点击高亮显示,多侧面搜索,缓存,复制,web管理接口以及其他很多特征。可运行在如Tomcat之类的Java servlet容器上。

    solrdump:使用光标有效地导出SOLR文档

    Solr中的游标是一个逻辑概念,它不涉及在服务器上缓存任何状态信息。 取而代之的是,返回给客户端的最后一个文档的排序值用于计算“标记”,该“标记”表示排序值的有序空间中的逻辑点。要求SOLR 4.7或更高版本,...

    Solr培训文档

    开源搜索引擎Solr学习 搜索引擎发展大事记 搜索引擎分类--目录式搜索引擎 搜索引擎分类--索引式搜索引擎 搜索引擎分类--元搜索引擎 开源搜索引擎Lucene家族 搜索引擎的三大核心 ...缓存机制 庖丁解牛分词器

    Mining Solr in Action最新英文版本pdf

    本英文书是针对Solr 4.7版本的实战性非常强的动手教程,无任何solr基础的人都会很容易从入门成长为高手,同时,该书穿插大量实例,覆盖solr4.7的方方面面,包括高级篇,如搜索性能优化,搜索结果缓存,索引分片,...

    trialverse-search-cache:基于Solr的Trialverse搜索缓存

    使用solr start -s ./jena-es-solr solr 5.3.0 运行在localhost:8081上的缓存尝试例如http://localhost:8081/?q=title:Fava 。知道问题用于研究的schema.xml需要默认设置要搜索的字段组合,因此*:Fava和Fava将是...

    zabbix-solr-multicore:Zabbix 上 SolR 监控的原始解决方案

    出于多种原因,我需要监视一些缓存/文档值。 我找到了一些模板来监控名为“collection1”的默认核心。 我决定为核心名称创建一个发现规则并监控一些项目。 此解决方案是使用 JMX 连接器的内置 jvm 模板和的组合 ...

    基于Lucene4.6+Solr4.6+S2SH实战开发垂直搜索引擎

    对于实际搜索引擎所涉及的各种核心技术都有全面细致的介绍,除了作为搜索系统核心的网络爬虫、索引系统、排序系统、链接分析及用户分析外,还包括网页反作弊、缓存管理、网页去重技术等实际搜索引擎必须关注的技术,...

Global site tag (gtag.js) - Google Analytics