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

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

[java] view plaincopyprint?
  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。

最后测试通过

转载于:https://www.cnblogs.com/zhwl/p/3499557.html

lucene4.5近实时搜索相关推荐

  1. es mysql延迟_ES 近实时搜索 更新延迟问题

    一.问题发现 有段代码更新 ES中的数据状态,将未读置成已读.是查一批,更新一批,再查再更新. public Boolean updateDealStatus(WarningQuery warning ...

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

    http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03?utm_source=infoq&utm ...

  3. ElasticSearch探索之路(五)集群与分片:选举、动态更新、近实时搜索、事务日志、段合并

    文章目录 集群内部原理 集群与节点 分片 选举 分片内部原理 索引不变性 动态更新索引 近实时搜索 事务日志 段合并 集群内部原理 集群与节点 一个运行中的Elasticsearch实例称为一个节点, ...

  4. ElasticSearch近实时搜索的实现

    ElasticSearch近实时搜索的实现 1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个数据库系统,执行插入以后立刻就能搜索到刚刚插入到数据.而 ...

  5. solr 近实时搜索

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

  6. es实现近实时搜索推荐的两种方式

    在百度搜索框里面,当我们输入某个关键字或关键词的时候,基本上不需要等待多久[秒级],当然网络太差就不说了,就可以马上列出一大堆相关的词句,这些是怎么实现的呢 总的来说,实现方式有两种,第一种,实时aj ...

  7. 【转载保存】基于Lucene的近实时搜索引擎优化总结

    一.搜索优化: 在工程领域,越是看起来"简单.确定"的问题,越是难以解决.近实时搜索引擎需要解决的问题只有一个:性能!它包含快速索引,快速搜索,以及索引到搜索的快速生效. 以下为百 ...

  8. 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步

    转载自 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先 ...

  9. 使用ElasticSearch进行近实时索引

    选择索引策略很困难. Elasticsearch 文档的确有一些一般性建议 ,并且有其他公司的 一些技巧 ,但这也取决于特定的用例. 在典型情况下,您有一个数据库作为事实的来源,并且有一个使事物可搜索 ...

最新文章

  1. 产品经理的核心能力——看清问题本质
  2. 从Matrix到这个idea
  3. Hibernate之检索方式(HQL/QBC/本地SQL)
  4. mysql is null走索引_Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引
  5. python中的常量可以修改吗_python实现不可修改的常量
  6. LeetCode 1201. 丑数 III(最小公倍数+二分查找)
  7. 大数据售前的一点感悟
  8. es5中数组方法unshift、splice、reduce使用
  9. 宏基4750网卡驱动linux,宏基4750g驱动下载-宏基4750g网卡驱动程序官方版 - 极光下载站...
  10. c语言调用min()函数求最小值,min函数(min函数多条件求最小值)
  11. 中期国际量化:安卓手机如何下载mt4及MT4一些功能介绍
  12. 7-7 图像抽丝 (10分)
  13. ABP框架系列之三十:(Javascript-API-Javascript-API)
  14. SQL Server2019重新下载失败
  15. Android 飞机大战 一
  16. 一门改考三门!西安电子科技大学网络与信息安全学院
  17. 案例: 场景:比如 在项目中显示所有项目/某用户的所有项目Controller中 ulr对应的名字是一致
  18. 机器学习笔记 - python学习记录一
  19. [每日一题] 128. 青蛙过河(数组、记忆化搜索、递归、剪枝)
  20. Android BLE订阅ios的ANCS另一个方式

热门文章

  1. 浅析三层架构与MVC模式的区别
  2. Android 实现简单的插件化模块化
  3. Yacc 与 Lex 快速入门(词法分析和语法分析)
  4. 动态规划--用最少的硬币类别找零钱
  5. sendto成功返回
  6. windows下进程间通信的(13种方法)
  7. springboot自动配置流程
  8. spring21:Aspectj实现后置通知@AfterReturning
  9. 请重新认识你作为程序员的价值
  10. 解决QT出现XXXX.dll不能加载问题