lucene3.5通过NRTManager和SearchManager实现近实时搜索
来源:互联网 发布:魔兽世界数据库3.22 编辑:程序博客网 时间:2024/05/19 02:40
完全的实时搜索:只要数据库一变动,马上要更新索引,writer.commit来操作
近实时搜索:当用户修改了信息之后,先把索引保存到内存中,然后在一个统一的时间对内存中的所有的索引进行提交操作。
reopen,NRTManager(near-real-time)
lucene通过NRTManager这个类来实现近实时搜索,所谓近实时搜索即在索引发生改变时,通过线程跟踪,在相对很短的时间反映给给用户程序的调用。
NRTManager通过管理IndexWriter对象,并将IndexWriter的一些方法(增删改)例如:
addDocument,deleteDocument等方法暴露给客户调用,它的操作全部在内存里面,所以如果你不调用IndexWriter的commit方法,通过以上的操作,
用户硬盘里面的索引库是不会变化的,所以你每次更新完索引库请记得commit掉,这样才能将变化的索引一起写到硬盘中,实现索引更新后的同步用
户每次获取最新索引 (IndexSearcher),可以通过两种方式:
第一种是通过调用NRTManagerReopenThread对象,该线程负责实时跟踪索引内存的变化,每次变化就调用maybeReopen方法,保持最新代索引,
打开一个新的IndexSearcher对象,而用户所要的IndexSearcher对象是NRTManager通过调用getSearcherManager方法获得SearcherManager对象,
然后通过SearcherManager对象获取IndexSearcher对象返回个客户使用,用户使用完之后调用SearcherManager的release释放IndexSearcher对象,最
后记得关闭 NRTManagerReopenThread;
第二种方式是不通过NRTManagerReopenThread对象,而是直接调用 NRTManager的maybeReopen方法来获取最新的IndexSearcher对象来获取最
新索引。
以下是相关代码:
private SearcherManager mgr = null; private NRTManager nrtMgr = null; private IndexWriter writer = null; writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35))); nrtMgr = new NRTManager (writer,new SearcherWarmer() { @Override public void warm(IndexSearcher s) throws IOException { System.out.println("reopen"); } }); //启动NRTManager的Reopen线程 NRTManagerReopenThread reopen = new NRTManagerReopenThread(nrtMgr, 5.0,0.025); reopen.setDaemon(true); reopen.setName("NrtManager Reopen Thread"); reopen.start(); mgr = nrtMgr.getSearcherManager(true); public void delete() { try { nrtMgr.deleteDocuments (new Term("id","2")); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void update() { try { /* * Lucene并没有提供更新,这里的更新操作其实是如下两个操作的合集 * 先删除之后再添加 */ Document doc = new Document(); doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED)); doc.add(new Field("content",contents[0],Field.Store.NO,Field.Index.ANALYZED)); doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); nrtMgr.updateDocument (new Term("id","1"), doc); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void search02() { IndexSearcher searcher = mgr.acquire(); try {// mgr.maybeReopen();//判断是否需要重新打开一个searcher TermQuery query = new TermQuery(new Term("content","like")); TopDocs tds = searcher.search(query, 10); for(ScoreDoc sd:tds.scoreDocs) { Document doc = searcher.doc(sd.doc); System.out.println(doc.get("id")+"---->"+ doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+ doc.get("attach")+","+doc.get("date")); } } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { mgr.release(searcher); } catch (IOException e) { e.printStackTrace(); } } }
- lucene3.5通过NRTManager和SearchManager实现近实时搜索
- 15-使用NRTManager和TimeManager实现近实时搜索
- Lucene实现SearchManager近实时搜索
- 近实时搜索SearcherManager和NRTManager的使用
- 近实时搜索SearcherManager和NRTManager的使用
- lucene4.5近实时搜索
- 【Lucene3.6.2入门系列】第12节_近实时搜索
- 【Lucene3.6.2入门系列】第12节_近实时搜索
- lucene4之后的近实时搜索实现
- solr-7 近实时搜索和实时搜索
- 【Lucene】近实时搜索
- Lucene近实时搜索
- 近实时搜索
- LuceneInAction-近实时搜索
- solr 近实时搜索
- lucene5--增量索引(Zoie)(近实时搜索的实现)
- 使用lucene3.6创建索引和实现简单搜索
- lucene 近实时搜索实例
- Awake Start
- Android UI设计规范(google)
- DWZ和ASP.NET MVC等框架的冲突问题解决方案
- 根据字符串或数组内容生成正则表达式
- IE浏览器总是弹出“安全警告”的问题
- lucene3.5通过NRTManager和SearchManager实现近实时搜索
- 一个在线的Apk方法统计工具
- 有关于Mysql远程链接问题
- DHCP的工作原理、怎么检测IP地址冲突
- Oracle Study之--RMAN启用block change tracking错误
- Java 集合转换(Object[]数组、List、Set、Map相互转换)
- JS之Window对象
- 动态规划算法应用于一个实际问题
- SSH的基本原理;