Solr5配置文件参数解析
Solr5的主要配置文件有solrconfig.xml和managed-schema,另外一些还有solr.xml,数据导入配置,ZooKeeper配置等。
这里详细介绍两个主要的配置文件。 <!--more-->
solrconfig.xml
solrconfig.xml文件是solr的主配置文件,主要配置高亮、数据源、索引大小、索引合并等所有的索引策略。
该文件位于$SolrHome/$Core/conf文件夹中,这个配置包含了solr自身的一些参数,主要包括lib、数据目录、索引配置、更新处理、查询处理、缓存、请求分发、高亮等。可参考官方文档:Configuring solrconfig.xml,以下内容整理自系统全面的认识Solr。
<luceneMatchVersion> 声明使用的lucene的版本。
<lib> 配置solr用到的jar包,具体语法示例中基本都有了。
<dataDir> 如果不用 $SolrHome/data 目录,可以指定其它别的目录来存放所有索引数据。如果使用了 replication,它可以匹配 replication 配置。如果这个目录不是绝对的,那会是当前 servlet 容器工作目录下的相对目录。
<directoryFactory> 索引文件的类型,默认solr.NRTCachingDirectoryFactory
这个文件类型包装了solr.StandardDirectoryFactory和小文件内存缓存的类型,来提供NRT搜索性能。NRT(near-real-time)近实时。
<indexConfig> 主要索引相关配置
<writeLockTimeout> IndexWriter写锁过时的时间,默认1000
<maxIndexingThreads> 最大索引的线程数,默认8
<useCompoundFile> 是否使用混合文件,Lucene默认是true,solr默认是false
<ramBufferSizeMB> 使用的内存的大小,默认100,这个实际用的时候应该修改大一点。
<ramBufferdDocs> 内存中最大的文档数,默认1000
<mergePolicy> 索引合并的策略。默认TiereMergePolicy,合并大小相似的段,与LogByteSizeMergePolicy相似。这个可以合并不相邻的段,能够设置一次合并多少个段,maxMergeAtOnce以及每层能合并多少个段segmentsPerTier。
<mergeFactor> 每次合并索引的时候获取多少个段,默认10。等同于同时设置了maxMergeAtOnce和segmentsPerTier两个参数。
<mergeScheduler> 段合并器,背后有一个线程负责合并,默认ConcurrentMergeScheduler。
<lockType> 文件锁的类型,默认native,使用NativeFSLockFactory。
<unlockOnStartup> 默认false
<termIndexInterval> Lucene每次加载到内存的terms数,默认128
<reopenReaders> 如果是true时,IndexReaders能够被reopened,而不是先关闭再打开,默认true
<deletionPolicy> 删除策略,用户可以自己定制,solr默认的是SolrDeletionPolicy,是solr标准的删除策略,允许在一定时间内保存索引提交点,来支持索引复制,以及快照等特性。可以设置maxCommitsToKeep保存提交的数量、maxOptimizedCommitsToKeep保存的优化条件的数量、maxCommitAge删除所有commit points的时间。
<infoStream> 为了调试,Lucene提供了这个参数,如果是true的话,IndexWriter会像设置的文件中写入debug信息。
<jmx> 一般不需要设置具体可以查看wiki文档
<updateHandler> 更新的Handler,默认DirectUpdateHandler2
<updateLog><str name="dir"> 配置更新日志的存放位置
<autoCommit> 硬自动提交,可以配置maxDocs即从上次提交后达到多少文档后会触发自动提交;maxTime时间限制;openSearcher,如果设为false,导致索引变化的最新提交,不需要重新打开searcher就能看到这些变化,默认false。
<autoSoftCommit> 如自动提交,与前面的<autuCommit>相似,但是它只是让这些变化能够看到,并不保证这些变化会同步到磁盘上。这种方法比硬提交要快,而且更接近实时更友好。
<listerner event> update时间监听器配置,postCommit每一次提交或优化命令后触发,
poatOptimize每次优化命令后触发。RunExecutableListener每次调用后执行一些其他操作。配置项:
<indexReaderFactory> 这个配置项用户可以自己扩展IndexReaderFactory,可以自己实现自己的
IndexReader。如果要明确声明使用的Factory则可以如下配置:

<query> 配置检索词相关参数以及缓存配置参数。
<maxBooleanClauses> 每个BooleanQuery中最大Boolean Clauses的数目,默认1024。
<filterCache> 为IndexSearcher使用,当一个IndexSearcher Open时,可以被重新赋于原来的值,或者使用旧的IndexSearcher的值,例如使用LRUCache时,最近被访问的Items将被赋予IndexSearcher。solr默认是FastLRUCache 。
cache介绍:http://blog.csdn.net/phinecos/article/details/7876385 filterCache存储了无序的lucene documentid集合,该cache有3种用途: 1)filterCache存储了filterqueries(“fq”参数)得到的document id集合结果。Solr中的query参数有两种,即q和fq。如果fq存在,Solr是先查询fq(因为fq可以多个,所以多个fq查询是个取结果交集的过程),之后将fq结果和q结果取并。在这一过程中,filterCache就是key为单个fq(类型为Query),value为document id集合(类型为DocSet)的cache。对于fq为range query来说,filterCache表现出其有价值的一面。 2)filterCache还可用于facet查询,facet查询中各facet的计数是通过对满足query条件的documentid集合(可涉及到filterCache)的处理得到的。因为统计各facet计数可能会涉及到所有的doc id,所以filterCache的大小需要能容下索引的文档数。 3)如果solfconfig.xml中配置了
<useFilterForSortedQuery/>,那么如果查询有filter(此filter是一需要过滤的DocSet,而不是fq,我未见得它有什么用),则使用filterCache。
<queryResultCache> 缓存查询的结果集的docs的id。
<documentCache> 缓存document对象,因为document中的内部id是transient,所以autowarmed为0,不能被autowarmed。
<fieldValueCache>字段缓存
<cache name="">用户自定义一个cache,用来缓存指定的内容,可以用来缓存常用的数据,或者系统级的数据,可以通过SolrIndexSearcher.getCache(),cacheLookup(), and cacheInsert()等方法来操作。
<enableLazyFieldLoading>保存的字段,如果不需要的话就懒加载,默认true。
<useFilterForSortedQuery>一般来讲用不到,只有当你频繁的重复同一个搜索,并且使用不同的排序,而且它们都不用“score”
<queryResultWindowSize>queryResultCache的一个参数。
<queryResultMaxDocsCached> queryResultCache的一个参数。
<listener event"newSearcher" class="solr.QuerySenderListener">query的事件监听器。
<useColdSearcher>当一个检索请求到达时,如果现在没有注册的searcher,那么直接注册正在预热的searcher并使用它。如果设为false则所有请求都要block,直到有searcher完成预热。
<maxWarmingSearchers>后台同步预热的searchers数量。
<requestDispatcher handleSelect="false">solr接受请求后如何处理,推荐新手使用false
<requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000" formdataUploadLimitInKB="2048" />使系统能够接收远程流。
<httpCaching never304="true">http cache参数,solr不输出任何HTTP Caching相关的头信息。
<requestHandler>接收请求,根据名称分发到不同的handler。
"/select" 检索SearchHandler
"/query" 检索SearchHandler
"/get" RealTimeGetHandler
"/browse" SearcherHandler
"/update" UpdateRequestHandler
"/update/json" JsonUpdateRequestHandler
"/update/csv" CSVRequestHandler
"/update/extract" ExtractingRequestHandler
"/analysis/field" FieldAnalysisRequestHandler
"/analysis/document" DocumentAnalysisRequestHandler
"/admin" AdminHandlers
"/replication" 复制,要有主,有从
<searchComponent>注册searchComponent。
<queryResponseWriter>返回数据
<admin> <defaultQuery>默认的搜索词
managed-schema
managed-schema在solr5之前叫schema.xml,文件主要配置索引和查询的字段信息,定义了所有的数据类型和各索引字段的信息(如类型,是否建立索引,是否存储原始信息等)。
fields块配置
<field name="" type="" indexde="" stored="" required="" multiValued="" omitNorms="" termVectors="" termPositions="" termOffsets="">
- name:名称
- type:类型从<types> 的fieldType中取
- indexed:是否索引
- stored:是否保存
- required:是否必须
- multiValuer:在同一篇文档中可以有多个值
- omitNorms:true的话忽略norms
- termVectors:默认false,如果是true的话,要保存字段的term vector
- termPositions:保存term vector的位置信息
- termOffects:保存term vector的偏移信息
- default:字段的默认值
<dynamicField>动态字段,当不确定字段名称时采用这种配置
<CopyField>
types块配置
<types> 块内,声明一系列的 <fieldtype>,以 Solr fieldtype类为基础,如同默认选项一样来配置自己的类型。
任何 FieldType 的子类都可以作为 field type 来使用,使用时可以用完整的包名,如果field type 类在 solr 里,那可以用 “solr”代替包名。提供多种不同实现的普通数据类型(integer, float等)。想知道怎么样被 Solr 正确地加载自定义的数据类型,请看:SolrPlugins
通用的选项有:
- name:类型名称
- class:对应于solr fieldtype类
- sortMissingLast=true|false 如果设置为true,那么对这个字段排序的时候,包含该字段的文档就排到不包含该字段的文档前面。
- sortMissingFirst=true|false 如果设置为true,那么对这个字段排序的时候,没有该字段的文档排在包含该字段的文档前面
- precisionStep 如何理解precisionStep呢?需要一步一步来: 参考文档:http://blog.csdn.net/fancyerii/article/details/7256379
- precisionStep是在做range search的起作用的,默认值是4
- 数值类型(int float double)在Lucene里都是以string形式存储的,当然这个string是经过编码的
- 经过编码后的string保证是顺序的,也就是说num1>num2,那么strNum1>strNum2
- precisionStep用来分解编码后的string,例如有一个precisionStep,默认是4,也就是隔4位索引一个前缀,比如0100,0011,0001,1010会被分成下列的二进制位“0100,0011,0001,1010“,”0100,0011,0001“,0100,0011“,”0100“。这个值越大,那么索引就越小,那么范围查询的性能(尤其是细粒度的范围查询)也越差;这个值越小,索引就越大,那么性能越差。
- positionIncrementGap和multiValued一起使用,设置多个值之间的虚拟空白的数量。字段有多个值时使用,如果一篇文档有两个title
title1: ab cd title2: xy zz
如果positionIncrementGap=0,那么这四个term的位置为0,1,2,3。如果检索"cd xy"那么能够找到,如果你不想让它找到,那么就需要调整positionIncrementGap值。如100,那么这是位置为0,1,100,101。这样就不能匹配了。
<fieldType name="random" class="solr.RandomSortField" indexed="true" />这个字段类型可以实现伪随机排序。
analyzer配置
包括tokenizer和filter,可以配置多个filter
其他配置
<uniqueKey>唯一字段,除非这个字段标记了“required=false”,否则默认为required字段
<copyField>一个源字段一个目的字段,将源字段的内容拷贝到目的字段,可以将多个字段合并,也可以对同一个字段,不同索引方式。
<defaultSearchField>默认的搜索字段
<solrQueryParser defaultOperator="OR"/>默认的检索词间的关系
数据导入配置
这个配置文件的名字是在solrconfig.xml中配置的,不过通常我们用data-config.xml这个名字,它是配置数据库信息,比如配置何种数据源datasource,全量索引,增量索引的数据库查询等。
由于这个配置项要讲的东西较多,单独在导入Mysql数据到Solr中中讲解。
solr.xml
solr.xml主要是配置solr主目录中的索引库即SolrCore,一个solr服务可以配置多个SolrCore,即可以管理多个索引库。
<solr>
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8983}</int>
<str name="hostContext">${hostContext:solr}</str>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
<int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
</solrcloud>
<shardHandlerFactory name="shardHandlerFactory"
class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:600000}</int>
<int name="connTimeout">${connTimeout:60000}</int>
</shardHandlerFactory>
</solr>
这是默认的内容,一般情况下不需要更改这里的东西,并且我也没怎么理解,所以等到我明白了再说。