在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。比如,索引频繁而搜索量很小。

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

  1. solr 近实时搜索

    摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...

  2. Lucene.net 实现近实时搜索(NRT)和增量索引

    Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的 ...

  3. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...

  4. Everything文件名实时搜索||解决局域网文件共享问题

    内容概要:Everything中文版下载地址及使用.用Everything轻松解决局域网文件共享问题.Everything语言设置问题 另:Everything只支持NTFS格式的磁盘(工作原理的缘故 ...

  5. jmeter 实时搜索结果

    因为JMeter 2.13你可以得到实时搜索结果发送到后端通过 后端侦听器 使用潜在的任何后端(JDBC.JMS网络服务,€Š) 通过提供一个实现类 AbstractBackendListenerCl ...

  6. Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

    http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的 ...

  7. lucene4.5近实时搜索

    近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的c ...

  8. 关于lucene的IndexSearcher单实例,对于索引的实时搜索

    Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比 ...

  9. 【Lucene】近实时搜索

    近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...

随机推荐

  1. CSS3 Filter详解(改变模糊度 亮度 透明度等方法)

    CSS3 Filter(滤镜)属性提供了提供模糊和改变元素颜色的功能.CSS3 Fitler 常用于调整图像的渲染.背景或边框显示效果. -webkit-filter是css3的一个属性,Webkit ...

  2. 第11章 Windows线程池(3)_私有的线程池

    11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...

  3. uGUI练习(八) InputField

    InputField 文本输入组件,本文练习InputField的属性及事件 一.属性 1.Character Limit 限制字符长度(0表示不限制),比如:设置只能输入3个字符(中文,英文,数字, ...

  4. Android自定义进度条颜色

    这个没法了只能看源码了,还好下载了源码, sources\base\core\res\res\ 下应有尽有,修改进度条颜色只能找progress ,因为是改变样式,首先找styles.xml ? 1 ...

  5. 07Mybatis_入门程序——根据前面的做的两个查询联系,做一些小的总结

    总结如下: 1.parameterType和resultType 在映射文件中通过parameterType指定输入 参数的类型. 在映射文件中通过resultType指定输出结果的类型. 例如: & ...

  6. 了解了这些才能开始发挥jQuery的威力(转)

    链接:http://www.cnblogs.com/dolphinX/archive/2013/10/08/3347677.html 由于当前jQuery如此的如雷贯耳,相信不用介绍什么是jQuery ...

  7. Eclipse添加注释简介

    (1)在方法或者属性上面添加注释:在方法或者属性字段的上面一行输/**,然后回车.一般情况下添加的注释格式如下所示,当然注释的格式是可以修改的:   1 2 3 4 5 /**   * @param ...

  8. Delphi7 安装ICS,与简单使用

    官网 http://www.overbyte.be/ 下载 OverbyteIcsV816 完成后解压到E:\Delphi7\OverbyteIcsV816\ 1.在library里加入E:\Delp ...

  9. C语言 简单的队列(数组队列)

    //简单的队列 #include<stdio.h> #include<stdlib.h> #define datatype int #define N 10 //定义队列结构体 ...

  10. 浅谈VC++中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...