近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的commit方法,然后重新打开reader,这个过程很耗费时间,因为writer的提交必须对索引里的所有新文件进行同步,同步操作耗费系统资源,近实时搜索使我们能够对新创建还未提交的索引进行搜索。

在4.5的版本上做一个简单的测试示例,参考lucene in action

  1. import junit.framework.TestCase;
  2. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  3. import org.apache.lucene.document.Document;
  4. import org.apache.lucene.document.Field;
  5. import org.apache.lucene.document.FieldType;
  6. import org.apache.lucene.document.TextField;
  7. import org.apache.lucene.index.*;
  8. import org.apache.lucene.search.IndexSearcher;
  9. import org.apache.lucene.search.Query;
  10. import org.apache.lucene.search.TermQuery;
  11. import org.apache.lucene.search.TopDocs;
  12. import org.apache.lucene.store.Directory;
  13. import org.apache.lucene.store.RAMDirectory;
  14. import org.apache.lucene.util.Version;
  15. public class NearRealTimeTest extends TestCase {
  16. public void testNearRealTime() throws Exception {
  17. Directory dir = new RAMDirectory();
  18. IndexWriterConfig config =  new IndexWriterConfig(Version.LUCENE_45,new StandardAnalyzer(Version.LUCENE_45));
  19. IndexWriter writer = new IndexWriter(dir, config);
  20. FieldType fieldType = new FieldType();
  21. fieldType.setIndexed(false);//set 是否索引
  22. fieldType.setStored(false);//set 是否存储
  23. fieldType.setTokenized(true);//set 是否分类
  24. fieldType.setOmitNorms(false);
  25. for(int i=0;i<10;i++) {
  26. Document doc = new Document();
  27. doc.add(new Field("id", ""+i, fieldType));
  28. doc.add(new Field("test", "aaa", TextField.TYPE_NOT_STORED));
  29. writer.addDocument(doc);
  30. }
  31. //IndexReader reader = writer.getReader();                 // 老版本的  3.x
  32. DirectoryReader reader = DirectoryReader.open(writer,true);   //创建近实时reader
  33. IndexSearcher searcher = new IndexSearcher(reader);   //将reader封装在IndexSearcher
  34. Query query = new TermQuery(new Term("test", "aaa"));
  35. TopDocs docs = searcher.search(query, 1);
  36. assertEquals(10, docs.totalHits);                        // 返回10个搜索结果
  37. writer.deleteDocuments(new Term("id", "7"));             // 删除一个文档
  38. Document doc = new Document();
  39. doc.add(new Field("id", "11",  fieldType));
  40. doc.add(new Field("test", "bbb",  TextField.TYPE_NOT_STORED));
  41. writer.addDocument(doc);
  42. //IndexReader newReader = reader.reopen();                 //老版本3.x
  43. IndexReader newReader = DirectoryReader.openIfChanged(reader,writer,true);   //重启reader
  44. reader.close();
  45. assertFalse(reader == newReader);
  46. reader.close();
  47. searcher = new IndexSearcher(newReader);
  48. TopDocs hits = searcher.search(query, 10);
  49. assertEquals(9, hits.totalHits);
  50. query = new TermQuery(new Term("text", "bbb"));
  51. hits = searcher.search(query, 1);
  52. assertEquals(1, hits.totalHits);
  53. newReader.close();
  54. writer.close();
  55. }
  56. }

可以看到更新文档后用 DirctoryReader.openIfChanged来获取Reader,如果有新内容,则返回新的Reader,这时我们需要关闭老的Reader。

最后测试通过

lucene4.5近实时搜索的更多相关文章

  1. lucene4之后的近实时搜索实现

    好久没干这块东西了,近几天须要做这个.所以又一次学了一下.首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经 ...

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

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

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

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

  4. 【Lucene】近实时搜索

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

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

    转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...

  6. solr 近实时搜索

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

  7. Solr -- 实时搜索

    在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcom ...

  8. sphinx通过增量索引实现近实时更新

    一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...

  9. 【搜索引擎】Solr全文检索近实时查询优化

    设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...

随机推荐

  1. hdoj 1089(费马小定理)

    题目大意:方程f(x)=5*x^13+13*x^5+k*a*x:输入任意一个数k,是否存在一个数a,对任意x都能使得f(x)能被65整出. 现假设存在这个数a ,因为对于任意x方程都成立 所以,当x= ...

  2. FlightGear 视角控制

    Flightgear提供了非常灵活的模块化功能 这里就简要记录一下视角切换功能 首先,需要了解一下Flightgear中的property tree的主要内容,这里暂略. http://wiki.fl ...

  3. jQuery慢慢啃之属性(三)

    1.attr(name|properties|key,value|fn)设置或返回被选元素的属性值. $("img").attr("src");//获取属性 $ ...

  4. <select>与<datalist>的区别

    size:下拉框中每次出现选项的个数 multiple:可以一次性选多个选项: disabled:时下拉框不可用,无法点击选项​ list:它的值应于id的值对应 datalist要与input标签一 ...

  5. bootstrap-datetimepicker配置选项

    依赖 需要bootstrap的下拉菜单组件 (dropdowns.less) 的某些样式,还有bootstrap的sprites (sprites.less and associated images ...

  6. 基于 libmemcahce 的memcache 操作

    <?php echo '<pre>'; //测试的键值的数量 $count = 30; $mem = create_memcache(); //var_dump($mem->i ...

  7. Android自定义View基础

    自定义控件, 视频教程 http://www.jikexueyuan.com/course/1748.html 1. 编写自定义view 2. 加入逻辑线程 3. 提取和封装自定义view 4. 利用 ...

  8. DDoS攻击

    来自百度百科 分布式拒绝服务攻击编辑 分布式拒绝服务攻击(英文:Distributed Denial of Service,缩写:DDoS)亦称洪水攻击.顾名思义,即是利用网络上已被攻陷的电脑作为“僵 ...

  9. BAE 环境下配置 struts2 + spring + hibernate(SSH)(二)struts2

    在myeclipse下开发的 应用但是 放到BAE下就出现了问题,虽然显示发布成功,但是访问的时候就会出现503 Service Unavailable 错误.通过调整 web.xml 发现纯Serv ...

  10. 排他锁Lock

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...