lucene4.5近实时搜索
近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的commit方法,然后重新打开reader,这个过程很耗费时间,因为writer的提交必须对索引里的所有新文件进行同步,同步操作耗费系统资源,近实时搜索使我们能够对新创建还未提交的索引进行搜索。
在4.5的版本上做一个简单的测试示例,参考lucene in action
- import junit.framework.TestCase;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.document.Field;
- import org.apache.lucene.document.FieldType;
- import org.apache.lucene.document.TextField;
- import org.apache.lucene.index.*;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.TermQuery;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.RAMDirectory;
- import org.apache.lucene.util.Version;
- public class NearRealTimeTest extends TestCase {
- public void testNearRealTime() throws Exception {
- Directory dir = new RAMDirectory();
- IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_45,new StandardAnalyzer(Version.LUCENE_45));
- IndexWriter writer = new IndexWriter(dir, config);
- FieldType fieldType = new FieldType();
- fieldType.setIndexed(false);//set 是否索引
- fieldType.setStored(false);//set 是否存储
- fieldType.setTokenized(true);//set 是否分类
- fieldType.setOmitNorms(false);
- for(int i=0;i<10;i++) {
- Document doc = new Document();
- doc.add(new Field("id", ""+i, fieldType));
- doc.add(new Field("test", "aaa", TextField.TYPE_NOT_STORED));
- writer.addDocument(doc);
- }
- //IndexReader reader = writer.getReader(); // 老版本的 3.x
- DirectoryReader reader = DirectoryReader.open(writer,true); //创建近实时reader
- IndexSearcher searcher = new IndexSearcher(reader); //将reader封装在IndexSearcher
- Query query = new TermQuery(new Term("test", "aaa"));
- TopDocs docs = searcher.search(query, 1);
- assertEquals(10, docs.totalHits); // 返回10个搜索结果
- writer.deleteDocuments(new Term("id", "7")); // 删除一个文档
- Document doc = new Document();
- doc.add(new Field("id", "11", fieldType));
- doc.add(new Field("test", "bbb", TextField.TYPE_NOT_STORED));
- writer.addDocument(doc);
- //IndexReader newReader = reader.reopen(); //老版本3.x
- IndexReader newReader = DirectoryReader.openIfChanged(reader,writer,true); //重启reader
- reader.close();
- assertFalse(reader == newReader);
- reader.close();
- searcher = new IndexSearcher(newReader);
- TopDocs hits = searcher.search(query, 10);
- assertEquals(9, hits.totalHits);
- query = new TermQuery(new Term("text", "bbb"));
- hits = searcher.search(query, 1);
- assertEquals(1, hits.totalHits);
- newReader.close();
- writer.close();
- }
- }
可以看到更新文档后用 DirctoryReader.openIfChanged来获取Reader,如果有新内容,则返回新的Reader,这时我们需要关闭老的Reader。
最后测试通过
转载于:https://www.cnblogs.com/zhwl/p/3499557.html
lucene4.5近实时搜索相关推荐
- es mysql延迟_ES 近实时搜索 更新延迟问题
一.问题发现 有段代码更新 ES中的数据状态,将未读置成已读.是查一批,更新一批,再查再更新. public Boolean updateDealStatus(WarningQuery warning ...
- 剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...
http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03?utm_source=infoq&utm ...
- ElasticSearch探索之路(五)集群与分片:选举、动态更新、近实时搜索、事务日志、段合并
文章目录 集群内部原理 集群与节点 分片 选举 分片内部原理 索引不变性 动态更新索引 近实时搜索 事务日志 段合并 集群内部原理 集群与节点 一个运行中的Elasticsearch实例称为一个节点, ...
- ElasticSearch近实时搜索的实现
ElasticSearch近实时搜索的实现 1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个数据库系统,执行插入以后立刻就能搜索到刚刚插入到数据.而 ...
- solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到.Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge ...
- es实现近实时搜索推荐的两种方式
在百度搜索框里面,当我们输入某个关键字或关键词的时候,基本上不需要等待多久[秒级],当然网络太差就不说了,就可以马上列出一大堆相关的词句,这些是怎么实现的呢 总的来说,实现方式有两种,第一种,实时aj ...
- 【转载保存】基于Lucene的近实时搜索引擎优化总结
一.搜索优化: 在工程领域,越是看起来"简单.确定"的问题,越是难以解决.近实时搜索引擎需要解决的问题只有一个:性能!它包含快速索引,快速搜索,以及索引到搜索的快速生效. 以下为百 ...
- 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步
转载自 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先 ...
- 使用ElasticSearch进行近实时索引
选择索引策略很困难. Elasticsearch 文档的确有一些一般性建议 ,并且有其他公司的 一些技巧 ,但这也取决于特定的用例. 在典型情况下,您有一个数据库作为事实的来源,并且有一个使事物可搜索 ...
最新文章
- 产品经理的核心能力——看清问题本质
- 从Matrix到这个idea
- Hibernate之检索方式(HQL/QBC/本地SQL)
- mysql is null走索引_Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引
- python中的常量可以修改吗_python实现不可修改的常量
- LeetCode 1201. 丑数 III(最小公倍数+二分查找)
- 大数据售前的一点感悟
- es5中数组方法unshift、splice、reduce使用
- 宏基4750网卡驱动linux,宏基4750g驱动下载-宏基4750g网卡驱动程序官方版 - 极光下载站...
- c语言调用min()函数求最小值,min函数(min函数多条件求最小值)
- 中期国际量化:安卓手机如何下载mt4及MT4一些功能介绍
- 7-7 图像抽丝 (10分)
- ABP框架系列之三十:(Javascript-API-Javascript-API)
- SQL Server2019重新下载失败
- Android 飞机大战 一
- 一门改考三门!西安电子科技大学网络与信息安全学院
- 案例: 场景:比如 在项目中显示所有项目/某用户的所有项目Controller中 ulr对应的名字是一致
- 机器学习笔记 - python学习记录一
- [每日一题] 128. 青蛙过河(数组、记忆化搜索、递归、剪枝)
- Android BLE订阅ios的ANCS另一个方式