solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到。
Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge)的完成而是直接检索索引并返回数据。参见原文
利用NRT,就可以设置soft commit,因为标准的commit操作代价高昂,soft commit可以做到近乎实时的查询效果而不丢失数据。
Commits 与 Optimizing
一个commit操作可以使新的查询请求能够感知到索引的变化,一般使用的 hard commit通过事务的方式确保数据是最新的,并且会有同步方法(fsync)的调用确保数据能持久化。而soft commit效率高是因为没有调用同步方法,这样的话,一旦JVM崩溃,可能会丢失数据。使用NRT可以使Solr多做soft commit而少一点hard commit。
我们所使用的optimize很像hard commit,不同的是它会强制将所有的索引片段合并为一个。一般我们很少使用它,因为它会重写整个索引。正常情况下,片段合并会根据配置自动进行,调用optimize只是手动加快了这一进程。
对于soft commit,常用下面两个参数:
| 参数 | 说明 |
|---|---|
| maxDocs | int型,每多少个文档push到索引一次 |
| maxTime | long型,每多少毫秒push到索引一次 |
Auto commit
使用autocommit也可以使用上面两个参数maxDocs和maxTime。
一般,设置autocommit为每1-10分钟一次,设置autosoftcommit为每秒一次。这样的话,新的文档就可以在1秒内被添加到索引,就算出现意外,丢失的数据也只是上一次hard commit之后添加的数据。
<autoSoftCommit>
<maxTime>1000</maxTime>
</autoSoftCommit>
这是一段commit的配置,从经验角度,配置maxTime参数比maxDocs效果好,尤其是索引量很大的时候。一般还建议对于批处理的索引请求关闭autoSoftCommit功能。
其他的参数
| 参数 | 参考值(默认) | 说明 |
|---|---|---|
| waitSearcher | 布尔(true) | 新的搜索器打开并注册为主查询搜索器之前,是否阻塞查询 |
| softCommit | 布尔(false) | 是否执行softCommit |
| expungeDeletes | 布尔(false) | 仅针对commit,是否清理掉已经delete的数据 |
| maxSegments | 整数(1) | 优化为多少个片段segments |
下面就是一个配置片段:
<commit waitSearcher="false"/>
<commit waitSearcher="false" expungeDeletes="true"/>
<optimize waitSearcher="false"/>
在URL中使用commit参数
下面的URL使用了commit操作使得测试文档被插入后可以立即生效:
http://localhost:8983/solr/core0/update?stream.body=<add><doc>
<field name="id">testdoc</field></doc></add>&commit=true
接下来,你可能会用到下面这个URL:
http://localhost:8983/solr/core0/update?stream.body=<optimize/>
还可以添加更多的参数,比如优化为10个片段,不需要等待操作结束:
http://localhost:8983/solr/core0/update?optimize=true&maxSegments=10&waitFlush=false
改变默认的commitWithin行为
参数commitWithin会使文档在一个确定的时间段内commit,因此常常用于NRT检索。但是,对于master/slave
环境,可能会导致新的文档不能复制到slave中(因为只有commit操作才会触发复制机制,softcommit不会使
replicate生效)。如果你需要这样的做,那就只能使用hard commit了,例如:
<commitWithin>
<softCommit>false</softCommit>
</commitWithin>
solr 近实时搜索的更多相关文章
- Lucene.net 实现近实时搜索(NRT)和增量索引
Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的 ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
- lucene4.5近实时搜索
近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的c ...
- 【Lucene】近实时搜索
近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...
- 剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...
- lucene4之后的近实时搜索实现
好久没干这块东西了,近几天须要做这个.所以又一次学了一下.首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经 ...
- Solr -- 实时搜索
在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcom ...
- 利用SOLR搭建企业搜索平台 之——solr配置solrconfig.xml
来源:http://blog.csdn.net/zx13525079024/article/details/25310781 solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括 ...
- 【搜索引擎】Solr全文检索近实时查询优化
设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...
随机推荐
- Jmeter中JDBC Request和BeanShell PostProcessor的结合使用(SQL模糊查询)
[前言] 今天记录一下Jmeter中JDBC Request和BeanShell PostProcessor的结合使用的方法(SQL模糊查询) [步骤] 1.下载对应数据库的驱动包到jmeter安装目 ...
- [題解](搜索)生日蛋糕(NOI1999)
搜索剪枝, 1.枚舉上下界: 先$R\subset$$(dep,min(\lfloor\sqrt{n-v}\rfloor,lastr-1))$ 后$H\subset$$(dep,min((n-v)/R ...
- CSS(一)清除浮动
问题1:关于清除浮动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- mysql /etc/my.cnf
[client] port=3306 socket = /tmp/mysql.sock default-character-set=utf8 [mysqld] # 1 general config p ...
- 为什么要问Servlet的初始化时间
Servlet的init方法到底是在什么时候调用的? j2ee specification和java doc中有以下说明 如果load-on-startup设置为>=0, 部署的时候就会调用. ...
- Python----Anaconda + PyCharm + Python 开发环境搭建(使用pip,安装selenium,使用IDLE)
1.Python开发中会用到的工具下载地址 FireBug插件安装地址:https://addons.mozilla.org/en-US/firefox/addon/firebug/ FirePath ...
- 配置HEXO
软件介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 使用版本和操作系统 官网最新版 Windo ...
- 009 Palindrome Number 判断一个正整数是否是回文数
详见:https://leetcode.com/problems/palindrome-number/description/ 实现语言:Java 方法一: class Solution { publ ...
- URAL 2080 Wallet
找规律发现只要找到两个相同数字之间,有多少个不同的数字,即为答案. 可以用树状数组离线处理. 坑点是卡有很多张,没用完的情况,后面的卡直接放在哪里, 就是 10 5 1 2 3 4 5 这样 开始数据 ...
- Storm概念学习系列之storm核心组件
不多说,直接上干货! Storm核心组件 了解 Storm 的核心组件对于理解 Storm 原理非常重要,下面介绍 Storm 的整体,然后介绍 Storm 的核心. Storm 集群由一个主节点和多 ...