近实时搜索就是他能打开一个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. Vijos1675 NOI2005 聪聪和可可 记忆化搜索

    简单题,结果因为理解错题意懵逼了好久…… moveTo[x][y]表示聪聪在节点x,可可在节点y时,聪聪下一步应到达哪一个节点 dp[x][y]表示聪聪在节点x,可可在节点y,且轮到可可行动时,所需时 ...

  2. Problem 1108 - 淼·诺贝尔

    #include<iostream> #include<vector> #include<algorithm> using namespace std; struc ...

  3. 一站式远程页面调试工具spy-debugger 2.0,已支持HTTPS

    项目名称: spy-debugger 项目地址:https://github.com/wuchangming/spy-debugger 关于spy-debugger npm Build Status ...

  4. Dedecms自定义sql 出现错误Safe Alert: Request Error step 2!

    Dedecms自定义执行sql: SELECT body FROM dede_addonarticle WHERE aid = (select max(aid) fromdede_addonartic ...

  5. Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)

    Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)   关于LAMP的各种知识,还请大家自行百度谷歌,在这里就不详细的介绍了,今天主要是介绍一下在Centos下安装,搭建一 ...

  6. Day12 线程池、RabbitMQ和SQLAlchemy

    1.with实现上下文管理 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: wanghuafeng #with实现上下文管理import c ...

  7. nginx下搭建fastcgi的开发环境

    在上一章最简单理解CGI,FastCGI,WSGI  我们将fastcgi规范类比HTTP.下面我们通过一个案例更加明白fastcgi 我们使用的是 nginx作为前端 代理,我们包装了gevent_ ...

  8. Canny边缘检测-Wiki

    Canny edge dector 由 John F. Canny 在1986年提出. Canny 算法的发展 Canny算法的步骤 2.1 降噪 2.2 寻找图像的亮度梯度 2.3 非极大值抑制 2 ...

  9. BZOJ 1025 游戏

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

  10. sql restore mode

    refer : https://msdn.microsoft.com/en-us/library/ms189272.aspx SELECT name, recovery_model_desc FROM ...