博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
跟益达学Solr5之solrconfig.xml配置详解
阅读量:4026 次
发布时间:2019-05-24

本文共 12553 字,大约阅读时间需要 41 分钟。

          solrconfig.xml配置文件中包含了很多solr自身配置相关的参数,solrconfig.xml配置文件示例可以从solr的解压目录下找到,如图:

 用文本编辑软件打开solrconfig.xml配置,你将会看到以下配置内容:

5.1.0
C:\solr_home\core1\data
${solr.lock.type:native}
true
${solr.ulog.dir:}
${solr.autoCommit.maxTime:15000}
false
${solr.autoSoftCommit.maxTime:-1}
1024
true
20
200
false
2
data-config.xml
explicit
10
explicit
json
true
text
{!xport}
xsort
false
query
text
explicit
true
true
false
terms
*:*

 下面我将对其中关键地方加以解释说明:

 lib

<lib> 标签指令可以用来告诉Solr如何去加载solr plugins(Solr插件)依赖的jar包,在solrconfig.xml配置文件的注释中有配置示例,例如:

<lib dir="./lib" regex=”lucene-\w+\.jar”/>

这里的dir表示一个jar包目录路径,该目录路径是相对于你当前core根目录的;regex表示一个正则表达式,用来过滤文件名的,符合正则表达式的jar文件将会被加载

 

dataDir parameter

用来指定一个solr的索引数据目录,solr创建的索引会存放在data\index目录下,默认dataDir是相对于当前core目录(如果solr_home下存在core的话),如果solr_home下不存在core的话,那dataDir默认就是相对于solr_home啦,不过一般dataDir都在core.properties下配置。

     <dataDir>/var/data/solr</dataDir>

 

codecFactory

 用来设置Lucene倒排索引的编码工厂类,默认实现是官方提供的SchemaCodecFactory类。

 

indexConfig Section

solrconfig.xml<indexConfig>标签中间有很多关于此配置项的说明:

<!-- maxFieldLength was removed in 4.0. To get similar behavior, include a

 

         LimitTokenCountFilterFactory in your fieldType definition. E.g.

 

     <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>

提供我们maxFieldLength配置项已经从4.0版本开始就已经被移除了,可以使用配置一个filter达到相似的效果,maxTokenCount即在对某个域分词的时候,最多只提取前10000Token,后续的域值将被抛弃。maxFieldLength若表示1000,则意味着只会对域值的0~1000范围内的字符串进行分词索引。

 

<writeLockTimeout>1000</writeLockTimeout>

writeLockTimeout表示IndexWriter实例在获取写锁的时候最大等待超时时间,超过指定的超时时间仍未获取到写锁,则IndexWriter写索引操作将会抛出异常

 

<maxIndexingThreads>8</maxIndexingThreads>

表示创建索引的最大线程数,默认是开辟8个线程来创建索引

 

<useCompoundFile>false</useCompoundFile>

 

是否开启复合文件模式,启用了复合文件模式即意味着创建的索引文件数量会减少,这样占用的文件描述符也会减少,但这会带来性能的损耗,在Lucene中,它默认是开启,而在Solr中,自从3.6版本开始,默认就是禁用的

 

 <ramBufferSizeMB>100</ramBufferSizeMB>

表示创建索引时内存缓存大小,单位是MB,默认最大是100M,

 

<maxBufferedDocs>1000</maxBufferedDocs>

表示在document写入到硬盘之前,缓存的document最大个数,超过这个最大值会触发索引的flush操作。

10
10

 用来配置Lucene索引段合并策略的,里面有两个参数:

 

maxMergeAtOne: 一次最多合并段个数

 

segmentPerTier:  每个层级的段个数,同时也是内存buffer递减的等比数列的公比,看源码:

// Compute max allowed segs in the index    long levelSize = minSegmentBytes;    long bytesLeft = totIndexBytes;    double allowedSegCount = 0;    while(true) {      final double segCountLevel = bytesLeft / (double) levelSize;      if (segCountLevel < segsPerTier) {        allowedSegCount += Math.ceil(segCountLevel);        break;      }      allowedSegCount += segsPerTier;      bytesLeft -= segsPerTier * levelSize;      levelSize *= maxMergeAtOnce;    }int allowedSegCountInt = (int) allowedSegCount;

 <mergeFactor>10</mergeFactor>

 

要理解mergeFactor因子的含义,还是先看看lucene in action中给出的解释:

IndexWriter’s mergeFactor lets you control how many Documents to store in memorybefore writing them to the disk, as well as how often to merge multiple indexsegments together. (Index segments are covered in appendix B.) With the defaultvalue of 10, Lucene stores 10 Documents in memory before writing them to a singlesegment on the disk. The mergeFactor value of 10 also means that once thenumber of segments on the disk has reached the power of 10, Lucene mergesthese segments into a single segment.For instance, if you set mergeFactor to 10, a new segment is created on the diskfor every 10 Documents added to the index. When the tenth segment of size 10 isadded, all 10 are merged into a single segment of size 100. When 10 such segmentsof size 100 have been added, they’re merged into a single segment containing1,000 Documents, and so on. Therefore, at any time, there are no more than 9segments in the index, and the size of each merged segment is the power of 10.There is a small exception to this rule that has to do with maxMergeDocs,another IndexWriter instance variable: While merging segments, Lucene ensuresthat no segment with more than maxMergeDocs Documents is created. For instance,suppose you set maxMergeDocs to 1,000. When you add the ten-thousandth Document,instead of merging multiple segments into a single segment of size 10,000,Lucene creates the tenth segment of size 1,000 and keeps adding new segmentsof size 1,000 for every 1,000 Documents added.

 IndexWritermergeFactory允许你来控制索引在写入磁盘之前内存中能缓存的document数量,以及合并

多个段文件的频率。默认这个值为10. 当往内存中存储了10document,此时Lucene还没有把单个段文件

写入磁盘,mergeFactor值等于10也意味着当硬盘上的段文件数量达到10lucene将会把这10个段文件合

并到一个段文件中。例如:如果你把mergeFactor设置为10,当你往索引中添加了10document,一个段

文件将会在硬盘上被创建,当第10个段文件被添加时,这10个段文件就会被合并到1个段文件,此时这个

段文件中有100document,10个这样的包含了100document的段文件被添加时,他们又会被合并到一

个新的段文件中,而此时这个段文件包含 1000document,以此类推。所以,在任何时候,在索引中不

存在超过9个段文件。每个被合并的段文件包含的document个数都是10,但这样有点小问题,我们还必须

 设置一个maxMergeDocs变量,当合并段文件的时候,lucene必须确保没有哪个段文件超过maxMergeDocs

 变量规定的最大document数量。设置maxMergeDocs的目的是为了防止单个段文件中包含的document数量

过大,假定你把maxMergeDocs设置为1000,当你创建第10个包含1000document段文件的时候,这时并

 不会触发段文件合并(如果没有设置maxMergeDocs为100的话,按理来说,这10个包含了1000个document

的段文件将会被合并到一个包含了10000document的段文件当中,但maxMergeDocs限制了单个段文件中

最多包含1000document,所以此时并不会触发段合并操作)。影响段合并还有一些其他参数,比如:

 

mergeFactor:当大小几乎相当的段的数量达到此值的时候,开始合并。

minMergeSize:所有大小小于此值的段,都被认为是大小几乎相当,一同参与合并。

maxMergeSize:当一个段的大小大于此值的时候,就不再参与合并。

maxMergeDocs:当一个段包含的文档数大于此值的时候,就不再参与合并。

 

段合并分两个步骤:

 1.首先筛选出哪些段需要合并,这一步由MergePolicy合并策略类来决定

2.然后就是真正的段合并过程了,这一步是交给MergeScheduler来完成的,MergeScheduler类主要做两件事:

      A.对存储域,项向量,标准化因子即norms等信息进行合并

      B.对倒排索引信息进行合并

     尼玛扯远了,接着继续我们的solrconfig.xml中影响索引创建的一些参数配置;

 

<mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>

mergeScheduler刚才提到过了,这是用来配置段合并操作的处理类。默认实现类是Lucene中自带的ConcurrentMergeScheduler

 

<lockType>${solr.lock.type:native}</lockType>

这个是用来指定LuceneLockFactory实现的,可配置项如下:

single = SingleInstanceLockFactory - suggested for a                  read-only index or when there is no possibility of                  another process trying to modify the index.         native = NativeFSLockFactory - uses OS native file locking.                  Do not use when multiple solr webapps in the same                  JVM are attempting to share a single index.         simple = SimpleFSLockFactory  - uses a plain file for locking         Defaults: 'native' is default for Solr3.6 and later, otherwise                   'simple' is the default

 single:表示只读锁,没有另外一个处理线程会去修改索引数据

native:即Lucene中的NativeFSLockFactory实现,使用的是基于操作系统的本地文件锁

simple:即Lucene中的SimpleFSLockFactory实现,通过在硬盘上创建write.lock锁文件实现

Defaults:从solr3.6版本开始,这个默认值是native,否则,默认值就是simple,意思就是说,你如果配置为Defaults,到底使用哪种锁实现,取决于你当前使用的Solr版本。

 

<unlockOnStartup>false</unlockOnStartup>

如果这个设置为true,那么在solr启动后,IndexWritercommit提交操作拥有的锁将会被释放,这会打破Lucene的锁机制,请谨慎使用。如果你的lockType设置为single,那么这个配置true or false都不会产生任何影响。

 

<deletionPolicy class="solr.SolrDeletionPolicy">

用来配置索引删除策略的,默认使用的是SolrSolrDeletionPolicy实现。如果你需要自定义删除策略,那么你需要实现Luceneorg.apache.lucene.index.IndexDeletionPolicy接口。

 

<jmx />

这个配置是用来在Solr中启用JMX,有关这方面的详细信息,请移步到Solr官方Wiki,访问地址如下:

 

<updateHandler class="solr.DirectUpdateHandler2">

指定索引更新操作处理类,DirectUpdateHandler2是一个高性能的索引更新处理类,它支持软提交

 

<updateLog>

      <str name="dir">${solr.ulog.dir:}</str>

</updateLog>

<updateLog>用来指定上面的updateHandler的处理事务日志存放路径的,默认值是solrdata目录即solrdataDir配置的目录。

 

<query>标签是有关索引查询相关的配置项

 

<maxBooleanClauses>1024</maxBooleanClauses>

表示BooleanQuery最大能链接多少个子Query,当不同的core下的solrconfig.xml中此配置项的参数值配置的不一样时,以最后一个初始化的core的配置为准。

 

<filterCache class="solr.FastLRUCache"

                 size="512"

                 initialSize="512"

                 autowarmCount="0"/>

用来配置filter过滤器的缓存相关的参数

 

<queryResultCache class="solr.LRUCache"

                      size="512"

                      initialSize="512"

                      autowarmCount="0"/>

用来配置对Query返回的查询结果集即TopDocs的缓存

 

<documentCache class="solr.LRUCache"

                   size="512"

                   initialSize="512"

                   autowarmCount="0"/>

用来配置对Document中存储域的缓存,因为每次从硬盘上加载存储域的值都是很昂贵的操作,这里说的存储域指的是那些Store.YESField,所以你懂的。

 

<fieldValueCache class="solr.FastLRUCache"

                        size="512"

                        autowarmCount="128"

                        showItems="32" />

这个配置是用来缓存Document id的,用来快速访问你的Document id的。这个配置项默认就是开启的,无需显式配置。

 

<cache name="myUserCache"

              class="solr.LRUCache"

              size="4096"

              initialSize="1024"

              autowarmCount="1024"

              regenerator="com.mycompany.MyRegenerator"

              />

这个配置是用来配置你的自定义缓存的,你自己的Regenerator需要实现SolrCacheRegenerator接口。

 

<enableLazyFieldLoading>true</enableLazyFieldLoading>

表示启用存储域的延迟加载,前提是你的存储域在Query的时候没有显式指定需要return这个域。

 

<useFilterForSortedQuery>true</useFilterForSortedQuery>

表示当你的Query没有使用score进行排序时,是否使用filter来替代Query.

   QuerySenderListener用来监听查询发送过程,即你可以在Query请求发送之前追加一些请求参数,如上面给的示例中,可以追加qery关键字以及sort排序规则。

 

<requestDispatcher handleSelect="false" >

设置为false即表示Solr 服务器端不接收/select请求,即如果你请求时,将会返回一个404

这个select请求是为了兼容先前的旧版本,已经不推荐使用。

 

<httpCaching never304="true" />

表示solr服务器段永远不返回304,那http响应状态码304表示什么呢?表示服务器端告诉客户端,你请求的资源尚未被修改过,我返回给你的是上次缓存的内容。Never304即告诉服务器,不管我访问的资源有没有更新过,都给我重新返回不走Http缓存。这属于Http协议相关知识,不清楚的请去Google HTTP协议详细了解去。

 

explicit
json
true

 这个requestHandler配置的是请求URL  /query跟请求处理类SearcherHandler之间的一个映射关系,即你访问时,会交给SearcherHandler类来处理这个http请求,你可以配置一些参数来干预SearcherHandler处理细节,比如echoParams表示是否打印HTTP请求参数,wtwriter type,即返回的数据的MIME类型,如json,xml等等,indent表示返回的json或者XML数据是否需要缩进,否则返回的数据没有缩进也没有换行,不利于阅读。

 

其他的一些requestHandler说明就略过了,其实都大同小异,就是一个请求URL跟请求处理类的一个映射,就好比SpringMVC中请求URLController类的一个映射。

 

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">

用来配置查询组件比如SpellCheckComponent拼写检查,有关拼写检查的详细配置说明留到以后说到SpellCheck时再说吧。

 

<searchComponent name="terms" class="solr.TermsComponent"/>

用来返回所有的Term以及每个documentTerm的出现频率

 

<searchComponent class="solr.HighlightComponent" name="highlight">

用来配置关键字高亮的,Solr高亮配置的详细说明这里暂时先略过,这篇我们只是先暂时大致了解下每个配置项的含义即可,具体如何使用留到后续再深入研究。

 

有关searchComponent查询组件的其他配置我就不一一说明了,太多了。你们自己看里面的英文注释吧,如果你实在看不懂再来问我。

text/plain; charset=UTF-8

 这个是用来配置Solr响应数据转换类,JSONResponseWriter就是把HTTP响应数据转成JSON格式,content-typeresponse响应头信息中的content-type,即告诉客户端返回的数据的MIME类型为text/plain,且charset字符集编码为UTF-8.

内置的响应数据转换器还有velocityxslt等,如果你想自定义一个基于FreeMarker的转换器,那你需要实现SolrQueryResponseWriter接口,模仿其他实现类,你懂的,然后在solrconfig.xml中添加类似的<queryResponseWriter配置即可

 

   最后需要说明下的是solrconfig.xml中有大量类似<arr> <list> <str> <int>这样的自定义标签,下面做个统一的说明:

 这张图摘自于Solr in Action这本书,由于是英文的,所以我稍微解释下:

arr:array的缩写,表示一个数组,name即表示这个数组参数的变量名

lstlist的缩写,但注意它里面存放的是key-value键值对

bool表示一个boolean类型的变量,name表示boolean变量名,

同理还有int,long,float,str等等

Strstring的缩写,唯一要注意的是arr下的str子元素是没有name属性的,而list下的str元素是有name属性的

 

最后总结下:

solrconfig.xml中的配置项主要分以下几大块:

     1.依赖的lucene版本配置,这决定了你创建的Lucene索引结构,因为Lucene各版本之间的索引结构并不是完全兼容的,这个需要引起你的注意。

     2.索引创建相关的配置,如索引目录,IndexWriterConfig类中的相关配置(它决定了你的索引创建性能)

     3.solrconfig.xml中依赖的外部jar包加载路径配置

     4.JMX相关配置

     5.缓存相关配置,缓存包括过滤器缓存,查询结果集缓存,Document缓存,以及自定义缓存等等

     6.updateHandler配置即索引更新操作相关配置

     7.RequestHandler相关配置,即接收客户端HTTP请求的处理类配置

     8.查询组件配置如HightLightSpellChecker等等

     9.ResponseWriter配置即响应数据转换器相关配置,决定了响应数据是以什么样格式返回给客户端的。

     10.自定义ValueSourceParser配置,用来干预Document的权重、评分,排序

 

     solrconfig.xml就解释到这儿了,理解这些配置项是为后续Solr学习扫清障碍。有些我没说到的或者我有意略过的,就留给你们自己去阅读和理解了,毕竟内容太多,1000多行的配置,一行不拉的解释完太耗时,有些都是类似的配置,我想你们应该能看懂。

  如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,

或者加裙

一起交流学习!

 

 

转载地址:http://lcxbi.baihongyu.com/

你可能感兴趣的文章
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>
CS4344驱动
查看>>
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
flutter-实现一个下拉刷新上拉加载的列表
查看>>
android 代码实现圆角
查看>>
postman调试webservice接口
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
Android DataBinding使用2-Recycleview
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>