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。
最后测试通过
lucene4.5近实时搜索的更多相关文章
- lucene4之后的近实时搜索实现
好久没干这块东西了,近几天须要做这个.所以又一次学了一下.首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经 ...
- Lucene.net 实现近实时搜索(NRT)和增量索引
Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的 ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
- 【Lucene】近实时搜索
近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...
- 剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...
- solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...
- Solr -- 实时搜索
在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcom ...
- sphinx通过增量索引实现近实时更新
一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...
- 【搜索引擎】Solr全文检索近实时查询优化
设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...
随机推荐
- java_设计模式_命令模式_Command Pattern(2016-08-09)
理解还不到位,先窜出来.等过一阵子再看,再理解. 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 类型:行为类模式 类 ...
- Android开发系列----学习伊始
因为对移动端开发开始感兴趣,开始学习App开发,没有苹果环境的我,只好先选择Android来玩一玩了~~ 找了一套视频,买了几本java.android开发的书,开始搞起~~
- ios开发之代理&&协议
Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎么做 ...
- Java学习----到底调用哪一个方法(多态)
public class Father { public void print() { System.out.println("Father:print()"); } } publ ...
- Windows手动搭建PHP运行环境
首先~可以先在目录里面创建一个wamp目录,我的创建在 E: 盘 1.0 下载Apache2.4,x64位.VC11组件[电脑多少位装多少位] apache下载地址:https://www.apach ...
- C# 窗体间传值方法大汇总(转)
第一种方法:创建一个类,里面声明用于存储接收的字段.传的时候存储于字段中,要用的时候,直接类名.字段名 进行调用.(这种方法传递是双向的) 第二种方法:1.在Form1里定义 public strin ...
- .NET序列化的一点技巧
介绍 序列化是将对象状态转换为可保持或传输的形式的过程.序列化的补集是反序列化,后者将流转换为对象.这两个过程一起保证数据易于存储和传输. .NET Framework 提供了两个序列化技术: 二进制 ...
- python读写Excel文件的函数--使用xlrd/xlwt
python中读取Excel的模块或者说工具有很多,如以下几种: Packages 文档下载 说明 openpyxl Download | Documentation | Bitbucket The ...
- elasticsearch 性能优化
#系统默认的最大打开文件数的限制 vi /etc/security/limits.conf * - nproc 50240 * - ...
- mapreduce (七) 几个实例
http://hi.baidu.com/hzd2712/item/d2465ae65270ab3e4cdcaf55 MapReduce几个典型的例子 在Google的<MapReduce: Si ...