牛骨文教育服务平台(让学习变的简单)

转载请注明出处: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类创建应用子类,是索引的操作更加简单。

ps:最近发现其他网站可能会对博客转载,上面并没有源链接,如想查看更多关于 基于lucene的案例开发  请点击这里。或访问网址http://blog.csdn.net/xiaojimanman/article/category/2841877http://www.llwjy.com/