本帖最后由 nettman 于 2015-4-16 22:38 编辑
问题导读:
1、实时索引中的IndexWriter的操作都是委托给TrackingIndexWriter来操作的?
2、TrackingIndexWriter中的方法和IndexWriter中的方法类似,都实现了索引的基本操作?
3、 TrackingIndexWriter类中的增删改操作语句是怎样的?
接上篇:基于lucene的案例开发15:实时索引的检索
上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查操作,这里就介绍一下实时索引的增删改操作,在实时索引管理类的那篇博客中,我们已经提到实时索引中的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类创建应用子类,使索引的操作更加简单。
相关内容:
基于lucene的案例开发1:lucene初始认知
基于lucene的案例开发2:索引数学模型
基于lucene的案例开发3:索引文件结构
基于lucene的案例开发4:创建索引
基于lucene的案例开发5:搜索索引
基于lucene的案例开发6:分词器介绍
基于lucene的案例开发7:Query查询
基于lucene的案例开发8:IndexSearcher中检索方法
基于lucene的案例开发9:案例初识
基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍
基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍
基于lucene的案例开发12:数据库连接池
基于lucene的案例开发13:实现实时索引基本原理
基于lucene的案例开发14:实时索引管理类IndexManager
基于lucene的案例开发15:实时索引的检索
基于lucene的案例开发16:实时索引的修改
基于lucene的案例开发17:查询语句创建PackQuery
基于lucene的案例开发18:纵横小说更新列表页抓取
基于lucene的案例开发19:纵横小说简介页采集
基于lucene的案例开发20:纵横小说章节列表采集
基于lucene的案例开发21:纵横小说阅读页采集
资料来源: http://blog.csdn.net/xiaojimanman/article/details/44280311
|