Solr -- 实时搜索

在solr中,实时搜索有3种方案

①soft commit,这其实是近实时搜索,不能完全实时。

②RealTimeGet,这是实时,但只支持根据文档ID的查询。

③和第一种类似,只是触发softcommit。

综上,其实是由实时(②)和近实时(①③)两种。

solr4.0 之后使用NRT的方法和需要的配置

方案1

使用soft commit达到近实时搜索的效果。

为了使用soft commit ,需要配置solrconfig.xml。其中两个地方需要修改

<autoCommit>
      <maxDocs>10000</maxDocs> <!-- maximum uncommited docs before autocommit triggered -->
      <maxTime>15000</maxTime> <!-- maximum time (in MS) after adding a doc before an autocommit
is triggered -->
      <openSearcher>false</openSearcher> <!-- SOLR 4.0.  Optionally don‘t open a searcher on
 hard commit.  This is useful to minimize the size of transaction logs that keep track of
uncommitted updates. -->
</autoCommit>

这里需要将hard commit 的 openSearcher改为true。Hard commit时间根据自己系统承载能力和需要设置。因为hard commit动作较大,对性能有较大影响。原则稍长较好,但又不能太长,以免突然断电导致大量数据丢失(hard commit前数据都在memery中)。

<!-- SoftAutoCommit
         Perform a ‘soft‘ commit automatically under certain conditions.
         This commit avoids ensuring that data is synched to disk.
         maxDocs - Maximum number of documents to add since the last
                   soft commit before automaticly triggering a new soft commit.
         maxTime - Maximum amount of time in ms that is allowed to pass
                   since a document was added before automaticly
                   triggering a new soft commit.
      -->
     <autoSoftCommit>
       <maxTime>2000</maxTime>
     </autoSoftCommit>

将soft commit 打开(默认配置注释了该节点),这里的时间是你希望在几秒内搜到,此处我的设置为2s。可根据需要设置,值越小NRT效果越好,相反的,会带来性能上的影 响。如果索引请求量不是特别大,则可以将值设小点,比如1000.不建议小于1000,小于1000并没有意义。

设置a,b之后就可通过普通的SearchHandler 搜到到了。Solr 默认配置的SearchHandler REST接口有“/select”“/query”“/browse”。

值得注意的是:当索引请求量巨大时,solr并不一定能保证在你设置的时间内能立马搜索到最新的文档,通常会有秒级别的延迟。

方案 2

需要配置solrconfig.xml。其中两个地方需要修改

<autoCommit>
      <maxDocs>10000</maxDocs> <!-- maximum uncommited docs before autocommit triggered -->
      <maxTime>15000</maxTime> <!-- maximum time (in MS) after adding a doc before an autocommit
is triggered -->
      <openSearcher>false</openSearcher> <!-- SOLR 4.0.  Optionally don‘t open a searcher on
 hard commit.  This is useful to minimize the size of transaction logs that keep track of
uncommitted updates. -->
</autoCommit>

此外还要配置solrconfig.xml的RealTimeGetHandler。根据solr的文档。该搜索Handler的接口为“/get”。该接口使用了一个特定的组件RealTimeGetComponent,该接口会通用solrCore的 getRealtimeSearcher()方法,后者会先搜索一下updateLog,再做普通搜索。

方案 3

第3种使用NRT的方法依然需要配置NRT1中的a项。这次使用普通的SearchHandler来实现NRT。利用solr的commit和 commitwithin。实现方式是每次索引文档后都明确的发送一个commit或者commitwithin命令。这样也可以马上搜索刚索引的数据。 由于发送命令需要走网络,时间上有不确定性,总体速度也不如NRT1。这里commit为hard commit请求,方法为commit=true;commitwithin为softcommit请求,方法为commitwithin=2000. 从前所述可以看出同样是commit,是用commitwithin将能更快搜到新文档,此处表示2s内要完成softcommit。该方法灵活性较高, 适合在一些特殊情况下使用。

综上,虽然我们可以通过不同手段(包括变相的手段NRT3)来实现NRT。但NRT1中的配置softcommit的方式才是最佳选择,这也是其存在的价值。但是在一些特殊的应用场景可以根据需要使用NRT3。比如,索引频繁而搜索量很小。

时间: 2024-10-25 21:44:59

Solr -- 实时搜索的相关文章

solr 近实时搜索

摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge)的完成而是直接检索索引并返回数据.参见原文 利用NRT,就可以设置soft commit,因为标准的commit操作代价高昂,soft commit可以做到近乎实时的查询效果而不丢失数据. Commits 与 Optimizing 一个commit操作可以使新的查询请求能够感知到索引的变化,一般

剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道

转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch中的变更不能立即可见,它还是提供了一个近实时的搜索引擎.如前一篇中所述,提交Lucene的变更到磁盘是一个代价昂贵的操作.为了避免在文档对查询依然有效的时候,提交变更到磁盘,Elasticsearch在内存缓冲和磁盘之间提供了一个文件系统缓存.内存缓存(默认情况下)每1秒刷新一次,在文件系统缓存中使

solr中文搜索倒排索引和数据存储结构

作为搜索,我们传统的方式(正排索引)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,既通过KEY寻找VALUE.而Lucene的搜索则是采用了倒排索引的方式,即通过VALUE找KEY.而在中文全文搜索中VALUE就是我们要搜索的单词,存放所有单词的地方叫词典.KEY是文档标号列表(通过文档标号列表我们可以找到出现过要搜索单词VALUE的文档).正排索引从文档编号找词: 倒排索引是从词找文档编号: 当文档数据来临时,solr会首先对文档数据进行分词,创建索引库和文

使用js实现前端内容实时搜索

本文主要基于项目的一个基本搜索功能,前端显示所有用户的在线评论信息:用户可以 根据需要在搜索框中输入搜索关键字,实时搜索出相应的显示结果,并高亮显示. 实现代码: /** * @brief 搜索一条房间中的符合要求的发言 * @param $keyword 搜索的关键字 */ var isSkip = false; $('.search-icon').click(function() { showSearch(); }); function showSearch() { $('.search-c

SOLR企业搜索平台 一 (搭建SOLR)

前提是已经安装了java的环境,环境变量的配置不做为讲解,网上也有大量资料.下面以linux为例来说明如何搭建好一个solr 1)首先下载solr,下载地址:http://mirror.bit.edu.cn/apache/lucene/solr/ 2)准备运行容器,我用的是tomcat-7.0.27. 也可以不用准备专门的容器,只需解压好solr,找到example文件夹,然后运行 start.jar.具体指令:java -jar start.jar.做应用的时候,不建议采用该方式.该方式内部包

jquery 表格排序,实时搜索表格内容

jquery 表格排序,实时搜索表格内容 演示 XML/HTML Code <table class="table-sort"> <thead> <tr> <th class="table-sort">First Name</th> <th class="table-sort">Last Name</th> <th class="table-sor

lucene4之后的近实时搜索实现

好久没干这块东西了,近几天需要做这个,所以重新学了一下,首先非常感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,现在已经都变了,这个类已经不存在了,在4.0之后消失的,到我现在使用的5.2.1都是下面的方法: 首先罗列会使用的特殊类(常用的不再赘述): TrackingIndexWriter  追踪writer,在api中有介绍,只有通过这个类进行更新ControlledRealTimeReopenThread才能获得更新 Contr

开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

logstash + elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.其实logstash是可以被别的替换,比如常见

实时搜索系统

ElasticSearch + Canal 开发千万级的实时搜索系统 公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市.用户ID昵称等进行搜索. 项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式.但随着业务的发展,搜索接口调用频次越来越高,搜索接口压力越来越大,搜索数据库经常崩溃,从而导致搜索功能经常不能使用. 从上面的系统架构图可以看出,当用户修改资料时,接口会修改用户库信息,接着触发器会将改变的用户信息写入临时表.定时脚本每隔1分钟扫描