转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44280311
http://www.llwjy.com/blogdetail/e42fa5c3097f4964fca0fdfe7cd7a9a2.html
个人的博客小站已经上线了,网址 www.llwjy.com,欢迎大家来吐槽~
上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查操作,这里就介绍一下实时索引的增删改操作,在实时索引管理类的那篇博客中,我们已经提到实时索引中的IndexWriter的操作都是委托给TrackingIndexWriter来操作的,TrackingIndexWriter中的方法和IndexWriter中的方法类似,都实现了索引的基本操作,下面就一一介绍下。
索引名就可以将我实例化
这里的NRTIndex和之前的NRTSearch类一样,都是根据索引名来实例化,在NRTIndex类中,我们定义两个属性,一个是TrackingIndexWriter对象,一个是索引名。因此NRTIndex的构造方法如下:
public NRTIndex(String indexName){ this.indexName = indexName; indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter(); }
TrackingIndexWriter中的操作和IndexWriter一样简单,几乎都是一条语句足够了,下面我们分别看下增删改的操作语句:
//新增一条记录 indexWriter.addDocument(doc); //删除符合条件的记录 indexWriter.deleteDocuments(query); //所有的记录都不要了 indexWriter.deleteAll(); //按照条件更新记录 indexWriter.updateDocument(term, doc);代码的实现就是如此简单,简简单单的一条语句就实现了索引的操作,当然这一切都要感谢Lucene的强大功能。
我很懒的
为了方便后面的操作,我们将这四个方法进行进一步的封装,使后续操作更加简单,NRTIndex类的源码如下:
/** *@Description: 索引管理操作类,增删改三种操作 */ package com.lulei.lucene.index.operation; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.NRTManager.TrackingIndexWriter; import org.apache.lucene.search.Query; import com.lulei.lucene.index.manager.IndexManager; public class NRTIndex { private TrackingIndexWriter indexWriter; private String indexName; //直接使用IndexManager中的indexWriter,将索引的修改操作委托给TrackingIndexWriter实现 public NRTIndex(String indexName){ this.indexName = indexName; indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter(); } /** * @param doc * @return boolean * @Author: lulei * @Description: 增加Document至索引 */ public boolean addDocument(Document doc){ try { indexWriter.addDocument(doc); return true; } catch (IOException e){ e.printStackTrace(); return false; } } /** * @param query * @return boolean * @Author: lulei * @Description: 按照Query条件从索引中删除Document */ public boolean deleteDocument(Query query){ try { indexWriter.deleteDocuments(query); return true; } catch (IOException e) { e.printStackTrace(); return false; } } /** * @return * @Author: lulei * @Description: 清空索引 */ public boolean deleteAll(){ try { indexWriter.deleteAll(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } /** * @param term * @param doc * @return * @Author: lulei * @Description: 按照Term条件修改索引中Document */ public boolean updateDocument(Term term, Document doc){ try { indexWriter.updateDocument(term, doc); return true; } catch (IOException e) { e.printStackTrace(); return false; } } /** * @throws IOException * @Author:lulei * @Description: 合并索引 */ public void commit() throws IOException { IndexManager.getIndexManager(indexName).getIndexWriter().commit(); } }
这里的对NRTIndex类的介绍就结束了,后面博客会对NRTSearch和NRTIndex类创建应用子类,是索引的操作更加简单。
原文地址:http://blog.csdn.net/xiaojimanman/article/details/44280311