首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

透过NRTManager和SearchManager实现近实时搜索

2013-07-01 
通过NRTManager和SearchManager实现近实时搜索是否进行实时搜索???? 实时搜索(近实时搜索)???? 完全的实时

通过NRTManager和SearchManager实现近实时搜索

是否进行实时搜索
???? 实时搜索(近实时搜索)
???? 完全的实时搜索:只要数据库一变动,马上要更新索引,writer.commit来操作
???? 近实时搜索:当用户修改了信息之后,先把索引保存到内存中,然后在一个统一的时间对内存中的所有的索引进行提交操作。reopen,NRTManager(near-real-time)

?

lucene3.5 近实时搜索(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();
??? ??? ??? }
??? ??? }
??? }

热点排行