分享

基于lucene的案例开发16:实时索引的修改

gefieder 2015-4-14 17:21:07 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 27446
本帖最后由 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的构造方法如下:
  1. public NRTIndex(String indexName){  
  2.         this.indexName = indexName;  
  3.         indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter();  
  4.     }  
复制代码

操作一条语句足够      TrackingIndexWriter中的操作和IndexWriter一样简单,几乎都是一条语句足够了,下面我们分别看下增删改的操作语句:
  1. //新增一条记录  
  2.     indexWriter.addDocument(doc);  
  3.     //删除符合条件的记录  
  4.     indexWriter.deleteDocuments(query);  
  5.     //所有的记录都不要了  
  6.     indexWriter.deleteAll();  
  7.     //按照条件更新记录  
  8.     indexWriter.updateDocument(term, doc);  
复制代码
     代码的实现就是如此简单,简简单单的一条语句就实现了索引的操作,当然这一切都要感谢Lucene的强大功能。
我很懒的。为了方便后面的操作,我们将这四个方法进行进一步的封装,使后续操作更加简单,NRTIndex类的源码如下:

  1. /**   
  2.      *@Description:  索引管理操作类,增删改三种操作
  3.      */   
  4.     package com.lulei.lucene.index.operation;   
  5.       
  6.     import java.io.IOException;  
  7.       
  8.     import org.apache.lucene.document.Document;  
  9.     import org.apache.lucene.index.Term;  
  10.     import org.apache.lucene.search.NRTManager.TrackingIndexWriter;  
  11.     import org.apache.lucene.search.Query;  
  12.       
  13.     import com.lulei.lucene.index.manager.IndexManager;  
  14.         
  15.     public class NRTIndex {  
  16.          
  17.         private TrackingIndexWriter indexWriter;  
  18.         private String indexName;  
  19.          
  20.         //直接使用IndexManager中的indexWriter,将索引的修改操作委托给TrackingIndexWriter实现  
  21.         public NRTIndex(String indexName){  
  22.             this.indexName = indexName;  
  23.             indexWriter = IndexManager.getIndexManager(indexName).getTrackingIndexWriter();  
  24.         }  
  25.          
  26.         /**
  27.          * @param doc
  28.          * @return boolean
  29.          * @Author: lulei   
  30.          * @Description:  增加Document至索引
  31.          */  
  32.         public boolean addDocument(Document doc){  
  33.             try {  
  34.                 indexWriter.addDocument(doc);  
  35.                 return true;  
  36.             } catch (IOException e){  
  37.                 e.printStackTrace();  
  38.                 return false;  
  39.             }  
  40.         }  
  41.          
  42.         /**
  43.          * @param query
  44.          * @return boolean
  45.          * @Author: lulei   
  46.          * @Description: 按照Query条件从索引中删除Document
  47.          */  
  48.         public boolean deleteDocument(Query query){  
  49.             try {  
  50.                 indexWriter.deleteDocuments(query);  
  51.                 return true;  
  52.             } catch (IOException e) {  
  53.                 e.printStackTrace();  
  54.                 return false;  
  55.             }  
  56.         }  
  57.          
  58.         /**
  59.          * @return
  60.          * @Author: lulei   
  61.          * @Description:  清空索引
  62.          */  
  63.         public boolean deleteAll(){  
  64.             try {  
  65.                 indexWriter.deleteAll();  
  66.                 return true;  
  67.             } catch (IOException e) {  
  68.                 e.printStackTrace();  
  69.                 return false;  
  70.             }  
  71.         }  
  72.          
  73.         /**
  74.          * @param term
  75.          * @param doc
  76.          * @return
  77.          * @Author: lulei   
  78.          * @Description: 按照Term条件修改索引中Document
  79.          */  
  80.         public boolean updateDocument(Term term, Document doc){  
  81.             try {  
  82.                 indexWriter.updateDocument(term, doc);  
  83.                 return true;  
  84.             } catch (IOException e) {  
  85.                 e.printStackTrace();  
  86.                 return false;  
  87.             }  
  88.         }  
  89.          
  90.         /**
  91.          * @throws IOException
  92.          * @Author:lulei   
  93.          * @Description: 合并索引
  94.          */  
  95.         public void commit() throws IOException {  
  96.             IndexManager.getIndexManager(indexName).getIndexWriter().commit();  
  97.         }  
  98.     }  
复制代码
      这里的对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

欢迎加入about云群371358502、39327136,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条