一.搜索处理器简介

  所有的请求处理器都实现一个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搜索器的特性及相关操作的更多相关文章

  1. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  2. Solr搜索技术

    Solr搜索技术 今日大纲 回顾上一天的内容: 倒排索引 lucene和solr的关系 lucene api的使用 CRUD 文档.字段.目录对象(类).索引写入器类.索引写入器配置类.IK分词器 查 ...

  3. 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)

    关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...

  4. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  5. solr第一天 基础增删改查操作

    全文检索技术   Lucene&Solr               Part2 1 课程计划 1.索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 2.Lucene的查询 a)  ...

  6. 数据结构Java实现04---树及其相关操作

    首先什么是树结构? 树是一种描述非线性层次关系的数据结构,树是n个数据结点的集合,这些集结点包含一个根节点,根节点下有着互相不交叉的子集合,这些子集合便是根节点的子树. 树的特点 在一个树结构中,有且 ...

  7. 超级文件搜索器(SuperSearch)

    写了个工具,各个分享渠道上传太难了,在这里分享给大家吧! 中文名称:超级文件搜索器 英文名称:  SuperSearch 适用对象:硬盘里文件达到数万至数千万级的用户 运行环境:WindowXP,Wi ...

  8. WEBUS2.0 In Action - [源代码] - C#代码搜索器

    最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...

  9. C#代码搜索器

    WEBUS2.0 In Action - [源代码] - C#代码搜索器 最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++ ...

随机推荐

  1. pikachu的xss及csrf

    一.XSS 可解析的js 未经过滤 XSS见框就插     script 大小写  中间插入 <img src="" onerror="alert(11111)&q ...

  2. day12_7.12递归函数与算法

    一.递归函数 递归函数是在函数的调用阶段直接或间接的调用自己. 于是下面就是一个简单的递归函数: def func(): print('我调我自己') func() func() 然而结果会报错,因为 ...

  3. VIJOS-P1232 核电站问题

    VIJOS-P1232 核电站问题 JDOJ 1373 https://neooj.com/oldoj/problem.php?id=1373 题目描述         一个核电站有N个放核物质的坑, ...

  4. spring cloud fegin传递request header

    本文链接:https://blog.csdn.net/zhongzunfa/article/details/82791903 1.概述 今天一个朋友, 遇到一个如何在使用spring cloud fe ...

  5. webapi跨域实现(CROS、JSONP)

    CROS: /// <summary> /// 支持WebAPI服务器端跨域 /// </summary> public class ServerCrossDomainAttr ...

  6. MySQL实战45讲学习笔记:第二十六讲

    一.引子 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因.你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来. 但是,如 ...

  7. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  8. 利用SQL生成模型实体类

    DECLARE @TableName sysname = 'TableName'; DECLARE @Result VARCHAR(MAX) = 'public class ' + @TableNam ...

  9. 推荐AndroidGodEye Android性能检测工具

    推荐AndroidGodEye Android性能检测工具 1 介绍 AndroidGodEye是一个可以在PC浏览器中实时监控Android性能数据指标的工具,你可以通过wifi/usb连接手机和p ...

  10. myeclipse配置springmvc教程

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...