UpdateHandlers

solrconfig.xml<updateHandler> 元素的配置对索引更新有影响,其设置影响的是内部的更新是如何完成的,对 request hander 处理客户端的更新请求的的高级配置没有影响

<updateHandler class="solr.DirectUpdateHandler2">
  ...
</updateHandler>

commit 提交

发送到 solr 的数据直到被提交到索引才可搜索。原因是在某些场景下提交较慢,且应与其他的提交请求隔离以避免覆盖数据。所以,在数据提交时最好进行控制。控制提交的时机有几个选项

commit and softCommit 提交和软提交

在 solr 里,一个 提交(commit) 是要求 solr 提交 修改到 Lucene 索引文件的行动。默认情况下,提交行动的结果是硬提交——所有 Lucene 索引文件到稳定的存储(磁盘)。当客户端更新请求包含了 commit=true 参数,这会确保被更新里的新增、删除影响的所有索引段会在索引更新结束时立即写入到磁盘。

如果指定了附加的标记 softCommit=true,solr 执行软提交,意思是 solr 会立即提交修改到 Lucene 数据结构但不保证 Lucene 文件写入到磁盘。这是近实时(Near Real Time)存储的一个实现,促进文档可见的一个特性,你不需要等待后台的合并和存储(如果使用 SolrCloud,则是对于 zk)结束。完整的提交意味着,如果服务器崩溃,solr 会精确的知道你的数据保存在哪;软提交意味着数据已存储,但是其位置信息尚未存储。由于不需要等待后台的合并结束,软提交给你更快的可见性。

关于 Near Real Time 操作的更多信息,参考 Near Real Time Searching

autoCommit 自动提交

这些设置控制挂起的更新自动推送到索引的频率。可以用 commitWithin 取代 autoCommit,该参数可以在发送更新请求到 solr 时定义,或在一个 updateRequestRequest 里定义

设置 说明
maxDocs 从上次提交后至今发生的更新的数量
maxTime 最早的未提交更新开始至今的毫秒数
openSearcher 当执行一次提交时是否开启一个新的 searcher。
默认为false,本次提交会把最近的索引变更刷入磁盘,但不会开启一个新的 searcher 来使这些变更可见

如果 maxDocsmaxTime 任一个满足,solr 自动执行提交。如果没有 autoCommit 标签,那么只有明确的提交会更新索引。是否使用自动提交取决于你的应用。

决定最好的自动提交参数,是在性能和准确性(这应该是搜索结果的准确性)之间做平衡。频繁的更新会提升准确性,因为新的内容会更快的被搜索到,但会降低性能。降低频率能提升性能但需要更久才能在查询里显示更新

<autoCommit>
  <maxDocs>10000</maxDocs>
  <maxTime>1000</maxTime>
  <openSearcher>false</openSearcher>
</autoCommit>

可以像设定自动提交一样来设定软自动提交,只需要把 autoCommit 替换成 autoSoftCommit

<autoSoftCommit>
  <maxTime>1000</maxTime>
</autoSoftCommit>

cmomitWithin

commitWithin 设置可强制文档在一个定义的时间段提交。多用于 Near Real Time Searching,默认是执行软提交。在主从架构下,不会复制新文档到从服务器。可以添加一个参数来强制硬提交,如下

<commitWithin>
  <softCommit>false</softCommit>
</commitWithin>

这样配置后,每次当你的更新信息的一部分是 commitWithin,就会自动执行硬提交

Event Listeners 事件监听器

UpdateHandler 可配置更新相关的时间监听器。可以在任何提交(event="postCommit")以后或者仅在优化指令(event="postOptimize")之后被触发

可以编写自己的更新事件监听器,但一般是通过 RunExecutableListerer 来运行外部程序

设置 说明
exe 要运行的程序名称,应该是相对于 solr home 的路径名
dir 工作目录,默认是 "."
wait 强制调用线程等待,直到程序返回响应。默认=true
args 传送给程序的任意参数,默认为空
env 任意要设置的环境变量,默认为空

Transaction Log 事务日志

RealTime Get 里描述过,事务日志是那个特性必须的。在 solrconfig.xmlupdateHandler 里配置

实时获取当前依赖更新日志,默认是开启滴。配置如下

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

有 3 个专家级的配置项可影响索引性能及一个 replica 在必须进入全量恢复前可以落后于更新多远——参考 写入侧容错 获取更新信息

设置名称 类型 默认值 说明
numRecordsToKeep int 100 每个日志多少条更新记录
maxNumLogsToKeep int 10 最多几个日志
numVersionBuckets int 65536 翻译不能...

一个例子,solrconfig.xml 要包含在 <config><updateHandler>,使用如下高级设置

<updateLog>
  <str name="dir">${solr.ulog.dir:}</str>
  <int name="numRecordsToKeep">500</int>
  <int name="maxNumLogsToKeep">20</int>
  <int name="numVersionBuckets">65536</int>
</updateLog>

results matching ""

    No results matching ""