Solr搜索器的特性及相关操作
一.搜索处理器简介
所有的请求处理器都实现一个Java类,本例实现了solr.SearchHandler。在运行时,solr.SearchHandler被解析为内置的Solr类org.apache.solr.handler.component.SearchHandler。一般来说,只要在solrconfig.xml文件中看到一个前缀为solr.的类,一般都是Solr的核心Java包之一。在配置文件中利用solr.前缀简写Solr类的名称,运行时再解析至相应的内置Solr类,这种方式让配置文件看起来更加简介有序。

搜索处理器执行过程:

这种设计方式使得应用程序很容易根据实际情况调整Solr的查询处理过程。通常情况下,一个搜索处理器由以下组件组成,其中每个组件都定义在solrconfig.xml文件中。
1.请求参数修饰组件
a.默认值修饰【defaults】:为客户端未指定的值的参数添加默认值
b.常量修饰【invariants】:将客户端的参数值覆写为固定值
c.后缀修饰【appends】:在客户端请求的末尾添加额外参数
2.预处理组件【first-components】:一组优先执行的可选搜索组件,执行预处理任务
3.主搜索组件【components】:一组链式组合的搜索组件,至少包含查询组件
4.后处理组件【last-components】:一组可选的链式组合的搜索组件,执行后处理任务
一般而言,一个请求处理器并不需要定义上述所有组件,比如/select请求处理器仅仅定义了默认值修饰组件。这意味着所有的其他组件均是默认为solr.SearchHandler实现。
二.新建搜索器
Solr的所有查询语句都由一个叫搜索器的组件处理。在Solr中,任何时候都只能存在一个“处于活动状态”的搜索器。所有的搜索请求处理器中的查询组件都向这个处于活动状态的搜索器发起查询请求。
处于活跃状态的搜索器拥有底层Lucene索引快照的只读视图。这意味着,如果将一个新的文档添加到Solr中,它在当前搜索器的搜索结果中是不可见的。如果要搜索到,必须先关闭当前的搜索器,打开一个新的搜索器,这个新的搜索器添加了索引更新以后的只读视图。
在solr web界面查看活跃的搜索器:

每一个commit提交操作都会创建一个新的搜索器,以确保更新后的文档和索引可以被搜索器检索到。首先,旧的搜索器必须被销毁,但旧的搜索器上面可能存在大量查询请求,所以,Solr要等到所有正在进行的搜索都被旧搜索器处理完之后才会执行销毁操作。
同时,所有基于旧搜索器中索引视图的缓存对象都将会失效,新的缓存对象需要重新计算,所以基于索引提交开启一个新的搜索器是一个非常耗费资源的操作,在这个过程中可能造成搜索延迟。所幸,Solr有许多工具可以帮助解决这个问题。最重要的是,Solr支持预热理念,即在后台预热新搜索器,同时保证当前搜索器的活跃状态,直到新搜索器预热完毕。
三.预热新搜索器
Solr秉承一种理念,即允许应用在短时间内提供过期数据,但不允许应用的查询性能有大幅下降。这就是说,在新搜索器预热完成,并准备好处理查询请求前,Solr不会关闭当前活跃的搜索器。
一般而言,Solr有两种预热机制:一种是利用旧缓存自动预热新缓存,另一种是执行缓存预热查询。缓存预热查询就是向搜索器提交一段预先在solrconfig.xml文件中配置好的查询语句,目的是让新搜索器将需要缓存的查询结果载入到缓存中。

注意:一旦Solr中有commit等newSearcher事件发生,这些查询语句就会被执行。只有识别出能够提高查询性能的查询语句时,搜索器的预热才能真正地发挥作用。一般而言,预热查询语句应当包含应用程序中使用最频繁的查询请求参数【q、fq、sort等】。Solr并不一定要有预热查询语句,如果在提交操作之后查询性能出现明显下降,才有必要考虑使用预热查询语句。而且,预热查询语句不易过多,只包含最重要的查询语句即可。
四.第一个搜索器
在Solr初始化过程中或重新加载完一个内核之后,预热第一个搜索器。是否为第一个搜索器配置预热查询语句,这完全由开发者自己决定。大多数的Solr开发者使用完全相同的查询语句来预热新搜索器和第一个搜索器。
与搜索器相关的配置元素:
1.useColdSearcher
适用于一个搜索请求已经提交,而目前Solr中没有定义搜索器的情况。如果它的值为false,那么Solr将会一直处于阻塞状态,直到正在预热的搜索器完成所有预测查询,否则会立即使一个正在预热的搜索器进入活跃状态,而不管搜索器的预热程度如何。
2.maxWarningSearchers
当一个搜索器预热之前又接到提交请求,这意味着在当前搜索器预热完成之前,另一个搜索器的预热又开始了。如果预热时间过长,那么上述情况就会频繁发生。该参数就是控制后台并发预热的搜索器最大数目。一旦达到阈值,新的提交请求将会失败。这是一种很好的保障机制,因为后台并发预热的搜索器过多时会快速耗尽服务器的内存和CPU资源,该参数默认为2。如果发现服务器经常达到阈值,那就需要重新思考预热机制的设计逻辑,看看新搜索器的预热时间是否过长。
Solr搜索器的特性及相关操作的更多相关文章
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
- Solr搜索技术
Solr搜索技术 今日大纲 回顾上一天的内容: 倒排索引 lucene和solr的关系 lucene api的使用 CRUD 文档.字段.目录对象(类).索引写入器类.索引写入器配置类.IK分词器 查 ...
- 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)
关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...
- 什么是Solr搜索
什么是Solr搜索 一.Solr综述 什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...
- solr第一天 基础增删改查操作
全文检索技术 Lucene&Solr Part2 1 课程计划 1.索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 2.Lucene的查询 a) ...
- 数据结构Java实现04---树及其相关操作
首先什么是树结构? 树是一种描述非线性层次关系的数据结构,树是n个数据结点的集合,这些集结点包含一个根节点,根节点下有着互相不交叉的子集合,这些子集合便是根节点的子树. 树的特点 在一个树结构中,有且 ...
- 超级文件搜索器(SuperSearch)
写了个工具,各个分享渠道上传太难了,在这里分享给大家吧! 中文名称:超级文件搜索器 英文名称: SuperSearch 适用对象:硬盘里文件达到数万至数千万级的用户 运行环境:WindowXP,Wi ...
- WEBUS2.0 In Action - [源代码] - C#代码搜索器
最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...
- C#代码搜索器
WEBUS2.0 In Action - [源代码] - C#代码搜索器 最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++ ...
随机推荐
- opencv获得轮廓内的所有坐标
std::vector<std::vector<cv::Point>> fillContour(const std::vector<std::vector<cv:: ...
- Pycharm工具使用和安装
1.安装包:https://pan.baidu.com/s/1O9JwuowlodhTR1m0VaKmhg 2.双击安装包安装: 3.选择安装目录 4.安装选项,Create Associations ...
- 【oracle】substr函数 字符截取
- Linux 访问iphone 上的照片
下面的链接,就差测试安装ifuse 了,估计是没有什么问题的. https://www.dedoimedo.com/computers/fedora-22-iphone.html
- django报错:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
django 迁移数据库报错 django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you ins ...
- generator(生成器)
什么是generator函数: 在js中,一个函数一旦执行,就会运行到最后或者遇到return时结束,运行期间不会有其它代码能打断它,也不能从外部再传入值到函数体内. generator函数的出现就可 ...
- 关于Dev-C++用户所必须知道的知识
开启这几个警告选项,才能拥有GCC编译器的较为全面的报错和警告 另外,目前Dev-C早已停止更新(停滞在版本号5.1,内置的GCC为4.9版本),且使用其检测数组变量也挺麻烦的,实在不推荐使用.
- Redis数据结构及常用命令(草稿)
通用命令 数据类型 string 字符 list 列表 set 集合 zset 有序集合 hash 散列(字典中的字典) bitmap 位图 hyperloglog
- mysql Duplicate entry '9223372036854775807' for key 'PRIMARY'
mysql插入数据报错提示: ERROR 1062(23000) Duplicate entry '9223372036854775807' for key 'PRIMARY' 发现问题果断 直接 ...
- .NET Core创建Worker Services
.NET CORE 3.0新增了Worker Services的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成windows服务或linux守护程序.如果安装的vs2019是中文版本,W ...