Solr5的主要配置文件有solrconfig.xmlmanaged-schema,另外一些还有solr.xml,数据导入配置,ZooKeeper配置等。

这里详细介绍两个主要的配置文件。

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。等同于同时设置了maxMergeAtOncesegmentsPerTier两个参数。

<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。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
"/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块配置

1
<field name="" type="" indexde="" stored="" required="" multiValued="" omitNorms="" termVectors="" termPositions="" termOffsets="">
  • name:名称
  • type:类型从 的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
  1. precisionStep是在做range search的起作用的,默认值是4
  2. 数值类型(int float double)在Lucene里都是以string形式存储的,当然这个string是经过编码的
  3. 经过编码后的string保证是顺序的,也就是说num1>num2,那么strNum1>strNum2
  4. 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,即可以管理多个索引库。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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>

这是默认的内容,一般情况下不需要更改这里的东西,并且我也没怎么理解,所以等到我明白了再说。