Solr的配置只要有三个地方:
- solr.xml 定义管理,日志,分片和SolrCloud的有关属性,是solr集群级别的配置文件
- solrConfig.xml 定义solr内核的主要配置,是solr核级别的配置文件
- schema.xml 定义索引结构,包括字段及其数据类型
core.properties
每一个Solr内核的目录下面都包含一个core.properties文件,该文件定义了solr自动发现内核的基本属性
通过core.properties文件,可以对内核的信息进行更改
solr在启动时通过core.properties文件自动的发现内核,一旦内核被发现则自动的定位到当前solr工程目录下,data/conf目录中的solrconfig.xml,通过solrconfig.xml来自定的初始化内核.
4.1.solrconfig.xml
启动solr引擎之后,可以通过访问http://localhost:8983/solr进入solr的控制台,点击collection1内核的Files目录可以看到当前内核的所有配置文件
如果配置文件需要更新,可以利用Reload标签对Solr的配置文件进行更新
4.1.2.solrconfig的一般配置
2.1.1solr的lucene版本
<luceneMatchVersion>4.10.3</luceneMatchVersion>
solr底层以来lucene,通过该参数可以限制lucene的最大版本,限用某些新功能
2.1.2 添加依赖的jar包
<lib dir="${solr.install.dir:../../..}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../..}/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="${solr.install.dir:../../..}/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
4.2 请求处理的过程
4.2.1请求处理简介
solr的请求通过http方式进行,查询请求为http get,如果是索引请求,则为http post请求.
solr请求url示例
solr请求的具体流程
- 1.客户端根据http请求的地址,将请求发送到指定的服务器,查询参数通过GET请求中的查询字符串进行传递
- 2.serlvet服务器接收到请求,并且根据solr/后的内容,将请求交给solr中统一的请求调度器(请求分配器),统一的请求分配器就是一个java servlet容器,可以过滤出url
- 3.solr的请求调度器根据请求路径中的collection1确定所查询的内核的名称,接下来,请求调度器会定位到solrconfig.xml文件中定义的/select请求处理器
- 4.请求处理器会调用一系列的请求组件,处理客户端的请求.
- 5.处理完请求之后,查询结果交给响应读写组件,进行格式化之后返回给客户端.
4.2.2. 搜索处理器(请求调度器)
solrconfig.xml文件中对/select请求处理器的定义
<requestHandler name="/select" class="solr.SearchHandler"> #用于处理查询的请求处理器类型
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults"> #默认的参数列表
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">fuzzy_searchkey</str>
<str name="wt">json</str>
<str name="defType">methodParser</str>
<str name="facet.limit">1000</str>
<bool name="preferLocalShards">false</bool>
</lst>
<arr name="components"> #定义默认组件
<str>rewrite</str>
<str>topIds</str>
<str>attribute</str>
<str>query</str>
<str>sightShuffle</str>
<str>shuffle</str>
<str>facet</str>
<str>expand</str>
<str>mlt</str>
<str>highlight</str>
<str>stats</str>
<str>aggregate</str>
<str>response</str>
<str>join</str>
<str>qscore</str>
<str>debug</str>
</arr>
</requestHandler>
搜索处理器处理查询的请求过程
通过 标签,可以定义solr请求的过程,可以在该标签内根据实际情况调整整个请求的处理过程.
- 1.请求参数修饰器
<lst name="defaults">默认值修饰,客户未指定值时的参数添加默认值
<lst name="invariants">覆盖常量值,将客户端的参数覆盖为固定值
<lst name="appends">后缀修饰符,在客户端请求的末尾添加额外的参数
- 2.预处理组件(first-components)
<arr name="first-components"> 一组优先执行的可选的搜索组件,执行预处理任务
- 3.搜索组件(components)
<arr name="components">一组链式的搜索组件,至少包含查询组件
- 4.后处理组件(last - components)
<arr name="last-components">z执行后处理任务
4.2.4扩展的搜索组件
<components>组件会用到的6个内置搜索组件
<arr name="components">
<str>rewrite</str>
<str>topIds</str>
<str>attribute</str>
<str>query</str>
<str>sightShuffle</str>
<str>shuffle</str>
<str>facet</str>
<str>expand</str>
<str>mlt</str>
<str>highlight</str>
<str>stats</str>
<str>aggregate</str>
<str>response</str>
<str>join</str>
<str>qscore</str>
<str>debug</str>
</arr>
- 查询组件 query
查询组件负责找出找出所有符合条件的文档,查询组件默认处于开启状态,其他组件需要手动的进行开启,查询组件利用处于活跃状态的搜索器对查询语句进行解析和执行.,查询语句的解析策略由defType参数指定.
<str name="defType">edismax</str>
- 分面组件
根据分面字段进行结果的统计
<str name="facet">true</str>
- 跟多类似的结果
如果更多类似结果组件被使用,可以搜索返回与结果集中相似的其他文档
- 高亮组件
对查询结果中高度相关的内容进行高亮返回
- 统计组件
统计组件可以对搜索的文档结果集中的数字字段进行数理统计,计算该字段的最小值,最大值,平均值,总和等.
- 调试组件
调试组件会返回执行过的查询语句的解析后的结果,以及结果集中每个文档相关度分数计算的详细结果
- 添加拼写检查作为后处理器
<!--<arr name="last-components">-->
<!--<str>spellcheck</str>-->
<!--</arr>-->
4.3管理搜索器
solrconfig.xml中有一些性能优化的标签,主要包括缓存,字段延时加载,新搜索器预热等.
4.3.1 新建搜索器
solr所有的查询都由一个叫做搜索器的组件组成,在solr中任何时刻只能有一个活跃的搜索器,所有的搜索请求处理器中的查询组件都向这个活跃的搜索器发起请求.
每次对solr引擎中的文档进行提交后,由于增加了新的数据,或者删除了部分旧的数据,会导致当前的搜索器失效,需要重建新的搜索器,而重建搜索器是非常耗时的,solr支持缓存预热的概念,即在后台预约新的搜索器,同时保持当前搜索器的活跃,直到新的搜索器预热完毕.
4.3.2 新搜索器的预热
solr允许查询旧的数据,而不允许查询性能有明显的下降(满足高可用性优先),在新的搜索器预约完成,并准备好查询数据前,solr并不会关闭旧的搜索器.
在用新的搜索器替换旧的搜索器前,会对新的搜索器进行预热,预热的方式主要有两种:
- 一种是利用旧缓存预热新的缓存
- 一种是执行缓存预热查询,就是利用一组预先在solrconfig.xml文件中配置好的查询语句,将执行的结果载入缓存中.
缓存预热的配置:
<listener event="newSearcher" class="solr.QuerySenderListener">
<arr name="queries">
<!--
<lst><str name="q">solr</str><str name="sort">price asc</str></lst> #定义查询字段
<lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>
-->
</arr>
</listener>
<arr name="queries">一旦Solr中有commit等newSearcher事件的发生,这些查询语句就会被执行.
<useColdSearcher>
<useColdSearcher>false</useColdSearcher>
提交一个solr请求,useColdSearcher如果为false,如果当前的solr搜索器没有预热完毕,该请求会被阻塞,知道正在预热的搜索器缓存预热完成,useColdSearcher如果为true,则solr会立即使一个正在缓存预热的搜索器进行活跃状态.
<maxWarmingSearchers>
<maxWarmingSearchers>2</maxWarmingSearchers>
有可能在新的搜索器缓存预热还未完成时,有新的提交使得另一个搜索器又开始进行预热,这样的情况如果频繁的发生,那么搜索的效率将会受到很大的影响.maxWarmingSearchers规定了允许最大预热查询器的数量,如果超过该数量,新的提交请求会失败.
4.4缓存管理
solr提供了一系列的缓存,来优化查询的性能.
4.4.1solr缓存原理
solr缓存原理主要包括四个方面:
- 缓存的大小及缓存置换算法
- 缓存命中率与缓存回收
- 缓存对象失效
- 自动预约新缓存
缓存大小
solr的缓存设置不能太大,如果缓存设置太大,则会影响solr JVM程序的运行情况.如果缓存使用达到了上限,那么采用LRU或则LFU对内存进行替换.
Solr默认采用LRU算法置换内存
Solr的过滤器缓存是使用LFU置换算法
solr缓存中的垃圾是通过JVM的GC进行回收的,所以避免将缓存的大小设置太大,加大了GC的时长,可以对缓存进行周期性的回收
缓存对象失效
solr所有的缓存对像都关联至对应的搜索器实例,如果搜索器实例失效,那么对应的缓存对象就会失效
自动预热的缓存
每一个solr的缓存都支持autowarmCount属性,这个属性表示自动预热缓存中旧的最高占比
<filterCache class="solr.FastLRUCache"
size="512"
initialSize="512"
autowarmCount="0"/> #就缓存对象占比为0
4.4.2 过滤器缓存(fq缓存)
<filterCache class="solr.FastLRUCache"
size="512"
initialSize="512"
autowarmCount="0"/>
主要的作用是将过滤器的索引结果在不同的查询之间被复用,如查询用到了过滤条件name:tom,如果有其他的查询也有一样的过滤条件,那么将会复用该结果.
4.4.3查询结果缓存
查询结果缓存会将查询的结果保存在缓存中,如果多次执行相同的查询,那么可以直接通过缓存获取结果
<queryResultCache class="solr.LRUCache"
size="0"
initialSize="0"
autowarmCount="0"/>
原理是将查询语句作为键,查询的文档id作为值
默认查询窗口的值
如果没有指定分页,返回默认窗口的大小
<queryResultWindowSize>20</queryResultWindowSize>
缓存最大的文档数
<queryResultMaxDocsCached>200</queryResultMaxDocsCached>
启用字段延时加载
<enableLazyFieldLoading>false</enableLazyFieldLoading>