Solr 基础性能调优讲解

 

本篇文章我们来了解一下solr的性能方面的调优,分为Schema优化、索引更新与提交调优、索引合并性能调优、Solr缓存、Solr查询性能优化

Schema优化

  1、index=true比index=false在索引时占用更多的内存、索引合并和优化时间更长,索引体积也响应变的更大,如果你不需要针对该域进行检索,可以设置为index=false

  2、如果不关心Term在文档中出现的次数对最终文档的影响可以设置omitNorms=true,即取消标准化因此对score的影响。它能减少磁盘空间的占用并加快索引速度

     3、如果你不需要对该域进行高亮,你还可以设置omitPositions=true进一步减小索引体积

  4、如果只需要利用倒排索引结构根据指定的Term找到对应的document,不需要计算Term在Document中的出现频率来考虑每个索引文档的权重,那么还可以设置omitTermFreqAndPositions=true即忽略TF计算以及Term在TermVector中的位置信息,这样能够进一步减小索引体积

  5、对于stored属性而言,在响应结果集中通过FL参数返回stored=true的域的执行开销很大,因为域值需要存储到硬盘写IO,查询时提取域值需要磁盘读IO,如果不需要存储可以设置stored=false,进一步优化索引的体积

  6、如果你想要存储的域值长度并不大, 但是为了能够缓解提取存储域带来的磁盘IO,此时可以设置compressed=true即启用域值数据压缩。开启compressed会降低磁盘IO但会增大CUP开销

  7、如果并不是一直都需要使用存储域,你可以设置域延迟加载,尤其是当你开启了域值数据压缩。设置延迟加载开启延迟加载之后,要返回的字段会被SetNonLazyFieldSelector立即加载,其他的域为延迟加载。启用域延迟加载,需要在solrconfig.xml中进行如下配置  

<enableLazyFieldLoading>false</enableLazyFieldLoading>

  8、如果你的域值很大,可以使用ExternalFileField域(外部文件),他不支持solr查询,只能用于显示和function计算,还可以将域值储存在外部系统,比如redis等,当需要域值的时候根据solr的UniqueKey去缓存中提取

  9、对于Java里的日期时间类型的数据,建议你使用Solr里的date域类型,如果你需要进行日期时间范围区间查询,那么建议使用Solr里的date域类型,而不是使用string域类型

  10、可以对facet域、排序域设置为docValue=true,它将会生成一个额外的正排表,会提升分面和排序的效率

  

索引更新与提交调优

  1、不建议使用显示硬提交,建议在solrConfig里面配置自动软/硬提交方式

   2、客户端在提交索引文档的时,建议使用批量软提交的方式添加索引文档

   3、单机模式下,在提交索引的时候建议使用ConcurrentUpdateSolrClient类,对于solrCloud模式下建议使用CloudSolrClient类来更新或提交索引

   4、默认情况下,solr会将document的每个域域值进行索引,当在对一些大文档进行索引的时候,因为创建索引过程中solr需要将document缓存在内存中,如果域的域值很大,内存占用就很大,可能触发更频繁的GC,GC可能会导致暂停索引创建过程,对一些大文本域使用的域类型配置LimitTokenCountFilterFactory来限制实际索引的文本长度,从而减少索引过程中内存占用

   5、在创建索引的时候,需要对文本进行分词处理时,建议配置停止词来剔除掉无用的噪音词,从而减少索引体积,同时还可以避免噪音词印象最终的检索结果

   6、禁用CompoundFile(复合)文件:开始复合文件虽然可以减少段文件个数,但是它会使得你的索引创建时间增加7%~33%,具体配置如下  

<useCompoundFile>false</useCompoundFile> 
<mergePolicy class=”org.apache.lucene.index.TieredMergePolicy”>
<float name=”noCFSRatio”>0.0</float>
</mergePolicy>

   7、如果索引速度经过一系列优化还是比较慢,建议可以使用MapReduce框架,利用多台机器的资源并行创建solr索引,从而加快索引速度

 

索引合并性能调优  

   1、降低索引合并频率:索引合并之后能加快Solr查询性能,但是索引合并是一个执行开销很大的操作,因此你需要在保证查询性能的前提下,尽量的降低索引合井的频率

  2、加大ramBufferSizeMB和maxBufferedDocs参数值,并且尽量降低显式提交的频率:索引提交除了用户显式的执行commit操作之外,ramBufferSizeMB或者maxBufferedDocs参数达到限定的阔值之后也会自动触发索引提交。 因此,为了降低索引合并的频率, 应该加大ramBufferSizeMB和maxBufferedDocs参数值,并且尽量降低显式提交的频率,比如采用批量commit,或者直接在solrconfig刀nl 中配置自动提交并控制自动提交的频率,避免显式提交

  3、增大mergeFactor参数值:加大mergeFactor参数值确实可以加快索引创建速度,降低索引合并频率但是同时它也会降低你的Solr查询响应速度

 

Solr缓存

  Solr中缓存都是由SolrIndexSearcher实例来管理的,一个SolrIndexSearcher实例对应一套缓存体系,如果你新建立一个SolrIndexSearcher实例,那么之前的SolrIndexSearcher全部会失效,当你数据量很大的时候,增量很频繁的时候对缓存的依赖很大,这个之后你需要在新建SolrIndexSearcher进行缓存预加载,术语叫预热

  solr默认的4中缓存类型

 

  1、filterCache

    用于缓存Filter Query从硬盘提取出来的Document的无序ID ,下次执行相同的FieldQuery就直接会命中缓存。Solr会默认为每一个FilterQuery提供FilterCache.

  应用场景:

  1)  缓存所有FilterQuery返回的结果集,solr会将主Q查询的结果集和Filter缓存的无序Document ID set集合取交集

  2)  当facet.method=enum时候会命中Filter缓存

  3)  如果solrconfig.xml中配置了<useFilterForSortedQuery/>true</useFilterForSortedQuery>,那么对于Solr排序操作也会使用Filter缓存。

  4)  Filter缓存通常还会用于其他Solr查询,比如facet.query、 group.query

  不适用场景

  价格区间、时间区间查询:全品类价格区间太多,时间精确到秒。如果对每一个价格区间的FilterQuery都启用FilterCache需要大量的内存支撑,另外由于区间太复杂,缓存命中率也会大大下降,所以这个时候我们可以类似这样的FilterQuery禁用Filter缓存

  2、documentCache

  DocumentCache(即文档缓存):用于储存已经从磁盘上提取出来的Lucence中的document对象。Document缓存保存的最大项数:应该大于返回结果集中可能的最大值*查询的最大并发量。 这样做的目的是因为为了确保solr不在从磁盘上提取索引文档,但是随着doc数目越来也多,documentCache占用的内存就会越来越大

  当你开启了document缓存并且开启了延迟加载,那么indexReader所提取的对象仅仅包含fl参数指定的Field,其他的Field会被延迟加载,这么做可以减少document缓存对内存的占用,当延迟加载的域,被后续请求到,那么indexReader会临时从硬盘加载该域

  还需要注意的是document缓存并不能进行缓存预热,也就意味这次当打开了一个SolrIndexSearcher的时候,缓存并不会提前进行加载,因为document缓存使用的是lucence内部的document ID,当索引数据变化了之后,该ID也会发生变化

 

  3、queryResultCache

  QueryResult缓存(查询结果集缓存):用于缓存查询的TOP N结果集的有序的Document ID,按照排序域进行排序。查询结果集缓存的内存占用明显要比Filter小,因为只有q,fq,sort参数同时一致的查询才会命中缓存

 

  4、fieldValueCache

  fieldValueCache(即域值缓存):与lucence中的fieldCache相似,但是不同的是FieldValueCache支持每个document对应多个值(多值域的多个值域,或者单值域因分词产生多个Term)。此缓存多用于facet查询,缓存的key为域的名称,value为docid到多个值的映射的数据结构。如果solrconfig.xml中没有定义<fieldValueCache>,那么Solr会自动为你生成一个size=10, max Size= 10 000,无autowarm的<fieldValueCache>

  

  HTTP缓存:除了可以在后台服务层启用Solr缓存之外,你还可以在前端HTTP协议层启用HTTP缓存,对于没有更新的资源,可以直接从HTTP缓存中直接返回,避免了同样的查询请求频繁请求服务器,这能在一定程度上减轻Solr Server的负载压力。如果想要开启HTTP缓存,配置如下:  

<httpCaching never304=”false”>
<cacheControl>max-age=30,  public</cacheControl> 
</httpCaching>

或者

<httpCaching lastModifiedFrom=”openTime” etagSeed=”Solr”>
<cacheControl>max-age=30,  public</cacheControl> 
</httpCaching> 

  never304参数设置为false 即表示开启Solr中的HTTP缓存,默认never304=true即禁用HTTP缓存。 Solr中的HTTP缓存只支持GET和HEAD请求,不支持POST请求。 SolrHTTP缓存兼容HTTPI.O和HTTPl.l协议头信息。

  你还可以在solrconfig.xml 配置firstSearcher和newSearcher事件监昕器来自动触发缓存自动预热。

  newSearcher用于当一个新的IndexSearcher实例被创建时,除了从旧IndexSearcher实例自动预热一部分缓存之外,还可以显式的指定一个查询来对缓存进行预热。 当某个查询耗时很长时,你可以提前通过newSearcher监昕器进行预热,这样后续你再执行该慢查询时会直接命中缓存。

  firstSearcher表示当一个新的IndexSearcher实例正在被初始化并且当前没有旧的Index Searcher实例用于新的IndexSearcher实例进行缓存自动预热,此时你需要显式的指定一个查询来自动预热缓存。 这个firstSearcher主要用于配置Solr刚启动时执行什么查询并放入缓存。 因为Solr刚启动时,缓存肯定是空的,为了保证刚启动的一段时间内的查询性能高效,因此你需要配置firstSearcher来提取预热。

  当使用que可Result缓存时,你还可以额外添加<queryResultWindowSize>配置来对其进行优化。 当一个查询被执行,返回的DocumentID会被收集,比如查询匹配的documentID是[10, 19)之间,如果queryWindowSize= 50,那么DocumentID [0, 50] 会被收集并缓存,在此范围内的Document将会命中缓存

 

Solr查询性能优化

  1、如果你的查询需要在三个域上进行查询,此时可以用copyField将三个域合并成为一个域,在合并之后的域上进行查询。因为在单个域上进行查询比在N个域上进行查询效率要高。但是使用copyField之后,你无法为每个单独的域进行加权

  2、应该优先让那些能够过滤掉大部分索引文档的FilterQuery先执行

  3、在对数字域进行范围查询的时候,可以调整precisionStep来对rangeQuery进行优化。precisionStep默认值是4,这个值越大,分解出来的索引前缀索引就越多,数字范围查询越快,但是会增大索引体积

  查询方面的优化点还有很多,需要针对不同的场景不同的去分析使用。大部分是在学习solr的过程中自己就可以体会到的,所以在这里不在赘述了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言有参函数调用时参数值传递问题

http://blog.csdn.net/hehuimin6/article/details/38800459

Solr router 路由介绍

目录 1、compositeId路由 1.1、compositeId路由原理 1.2、compositeId路由查询 2、implicit路由 2.1、implicit路由原理 2.2、implicit路由查询 3、扩展 3.1、compositeId路由方式扩展 3.2、implicit路由方式扩张 solrcloud的官方文档有对路由的简短介绍&#xff0c;但…

行为树的原理及实现

查阅了一些行为树资料&#xff0c;目前最主要是参考了这篇文章&#xff0c;看完后感觉行为树实乃强大&#xff0c;绝对是替代状态机的不二之选。但从理论看起来很简单的行为树&#xff0c;真正着手起来却发现很多细节无从下手。 总结起来&#xff0c;就是&#xff1a; 1、行为树…

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中&#xff0c;有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人&#xff0c;在RPG游戏中是否捡到装备等等。在进行碰撞检测时&#xff0c;我们最常用的工具就是射线&#xff0c;Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

图数据库 HugeGraph : IndexLabel

IndexLabel 用来定义索引类型&#xff0c;描述索引的约束信息&#xff0c;主要是为了方便查询。 IndexLabel 允许定义的约束信息包括&#xff1a;name、baseType、baseValue、indexFeilds、indexType&#xff0c;下面逐一介绍。 name: 属性的名字&#xff0c;用来区分不同的 …

boost常用库

1.boost::any boost::any是一种通用的数据类型&#xff0c;可以将各种类型包装后统一放入容器内&#xff0c;最重要的它是类型安全的。有点象COM里面的variant。 使用方法&#xff1a; any::type() 返回包装的类型 any_cast可用于any到其他类型的转化 #include <boost/any.h…

HugeGraphServer 部署安装

官方文档链接&#xff1a;https://hugegraph.github.io/hugegraph-doc HugeGraphServer Quick Start 1 概述 HugeGraph-Server 是 HugeGraph 项目的核心部分&#xff0c;包含Core、Backend、API等子模块。 Core模块是Tinkerpop接口的实现&#xff0c;Backend模块用于管理数…

java中调用System.currentTimeMillis()获取当前时间来求出时间差及程序执行的时间

package com.test;import java.util.Scanner; //String的连接1000次 class StringOperate{private String str;public long doWork(){long beginSystem.currentTimeMillis();//开始时间setStr(null);for(int i0;i<10000;i){setStr(getStr() i);}long endSystem.currentTime…

HugeGraph 多图配置

多图配置 我们的系统是可以存在多个图的&#xff0c;并且各个图的后端可以不一样&#xff0c;比如图 hugegraph 和 hugegraph1&#xff0c;其中 hugegraph 以 cassandra 作为后端&#xff0c;hugegraph1 以 rocksdb作为后端。 配置方法也很简单&#xff1a; 修改 gremlin-se…

JanusGraph: 可视化 Gephi 插件安装

下载地址 https://gephi.org/ 安装 下一步默认安装即可 打开安装插件 打开后发现提示无法连接&#xff0c;并且可用插件显示为0 &#xff08;我更新过所以不为0&#xff09; 点击“代理配置” 设置代理 安装插件 Graph Streaming 继续 重新启动&#xff0c;安装完成 点击概…

【Boost】Boost使用几条简单笔记

头文件就是库 使用者最常问的问题就是“我该怎么安装Boost”&#xff0c;这个也是我一开始最关心的问题&#xff0c;Boost这点做的很好&#xff0c;将大部分实现都封装在头文件里&#xff0c;所以对于一些基本的Boost库&#xff0c;其实是不需要安装的&#xff0c;只需要将头文…

分析模板方法设计模式

首先来看看用来比较int和String分别进行1000次运算求需要的时间进行比较&#xff0c;代码的实现&#xff1a; package com.test;import java.util.Scanner; //String的连接1000次 class StringOperate{private String str;public long doWork(){long beginSystem.currentTimeM…

JanusGraph(HugeGraph通用): 可视化 GraphEXP 插件安装

JanusGraph&#xff1a; 可视化 Gephi 插件安装可参考&#xff1a;https://datamining.blog.csdn.net/article/details/103894994 下载地址&#xff1a;https://github.com/bricaud/graphexp 安装 解压&#xff0c;在根目录下修改 graphexp.html <div class"nav inp…

java中的接口的定义以及实现关系

一、什么是接口&#xff1f; - 硬件接口&#xff1a;设备之间的连接方式 - 软件接口&#xff1a;程序代码&#xff0c;特殊的类&#xff0c;表示一种规范&#xff0c;是具有N个方法的特征集合。 java中的接口&#xff1a; 专家说的多个抽象类的抽象就是接口。 interface …

迁移 Cloudera Manager 节点 ,迁移Cloudera Scm Server端

目录 1.迁移节点信息&#xff1a;212 -> 44 2.压缩存储目录&#xff0c;备份SCM Server数据 3.在新服务器安装server端 4.修改 cloudera-scm-server 配置文件 5.解压恢复备份数据到新服务器指定配置的目录中 6.修改所有agent节点的配置文件内容 7.迁移ClouderaManage…

CM,CDH 修改迁移元数据库

目录 1.停止所有服务 2.停止Cloudera Management Service服务 3.登录CM所在服务器&#xff0c;停止cloudera-scm-server服务&#xff0c;命令如下&#xff1a; 4.停止CM服务和CDH集群后&#xff0c;对数据库进行迁移 5.登录cloudera-scm-server服务所在服务器&#xff0c;…

面向接口编程思想

package com.test; /*面向接口编程&#xff1a;多态的好处&#xff1a;把实现类对象赋给接口类型变量&#xff0c;屏蔽了不同实现类之间的差异&#xff0c;从而可以做到通用编程 案例&#xff1a;使用USB设备来工作。*/ //指定USB规范 interface IUSB{void swapData(); } class…

Cloudera-Manager-agent 误删恢复

场景&#xff1a; 同事操作失误&#xff0c;将agent节点误删了 解决方法 1.对比正常agent节点与被删除节点安装包差异 yum list installed |grep cloudera 2.通过和正常的服务器对比我们发现&#xff0c;丢失的只有cloudera-manager-agent.x86_64 3.查看yum源中所有clouder…

java中的内部类

内部类&#xff1a;定义在类结构中的另一个类&#xff1a; 类中的定义的成员&#xff1a;字段、方法、内部类 为什么使用内部类&#xff1f; 增强封装&#xff0c;把内部类隐藏在外部类之内&#xff0c;不许其他类访问该类。内部类能提高代码的可读性和可维护性&#xff0c;…

JanusGraph 安装

下载地址&#xff1a;https://github.com/JanusGraph/janusgraph/releases/ 版本&#xff1a;Version 0.3.2 (June 16, 2019) 安装 解压 janusgraph-0.3.2-hadoop2.zip 文件 janusgraph单机版安装 注&#xff1a;本次安装janusgraph基于es和hbse&#xff0c;所以先安装es和…