4、学习Lucene3.5之索引删除、更新

(1)删除索引

/**
     * 删除索引
     */
    public void deleteIndex(){
        IndexWriter indexWriter = createIndexWriter();
        /**
         * deleteDocuments()参数解析:
         * 第一种:Term term 删除特定的索引(Term是一个精确查找的值)
         * 第二种:Query query 删除一系列符合条件的索引
         * 注意:
         *     使用此方法删除的索引,并不会完全被删除,而是存储在一个“回收站”中,可以恢复
         */
        try {
            indexWriter.deleteDocuments(new Term("id", "1"));
            /**
             * 若当indexWriter无法进行关闭操作时,则需要采用indexWriter.commit()来使新的索引生效!!
             */
            indexWriter.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
//            closeIndexWriter(indexWriter);
        }
    }
(2)恢复删除索引

/**
 * 恢复删除的索引(从“回收站”中恢复)
 */
public void restoreIndex(){
    IndexReader reader = null;
    try {
        /**
         * 问题:这里为什么open()方法多了一个参数false?
         * 原因:
         *     IndexReader.open(Directory directory)方法自动调用open(Directory directory, boolean readOnly),且第二
         * 个参数“readOnly”(只读)默认为“true”,表示使用IndexReader对象只能读索引,不能进行其他操作。而这里需要
         * 从“回收站”中恢复删除的索引,就需要将“readOnly”设置为“false”,否则没有操作的权限。
         *
         */
        reader = IndexReader.open(directory, false);
        //恢复时,需要把“readOnly”设置为“false”
        reader.undeleteAll();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (reader != null){
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
(3)强制删除索引(无法再恢复)

/**
 * 强制删除“回收站”中的索引,将无法再恢复
 */
public void forceDelete(){
    IndexWriter indexWriter =createIndexWriter();
    try {
        /**
         * 在Lucene3.5之前,一直都是使用optimize()进行处理,但是由于太消耗资源,已经被弃用
         */
        indexWriter.forceMergeDeletes();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        closeIndexWriter(indexWriter);
    }
}
(4)优化和合并索引

/**
 * 优化和合并索引
 */
public void forceMerge(){
    IndexWriter indexWriter =createIndexWriter();
    try {
        /**
         * 合并索引为2段,这2段中被删除的数据会被清空
         * 特别注意:在Lucene3.5之后不建议使用,因为会有大量的开销,并且在Lucene3.5之后,Lucene会根据情况自动处理
         */
        indexWriter.forceMerge(2);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        closeIndexWriter(indexWriter);
    }
}
(5)更新索引

/**
 * 更新
 */
public void updateIndex(){
    IndexWriter indexWriter =createIndexWriter();
    try {
        /**
         *
         */
        Document document = new Document();
        document.add(new Field("id","7",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
        //存储在硬盘,但不分词,但加权
        document.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
        //不存储在硬盘,但分词、加权
        document.add(new Field("content",content[0],Field.Store.NO,Field.Index.ANALYZED));
        //存储在硬盘,但不分词,不加权
        document.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
        /**
         * updateDocument(Term term, Document doc)方法解析:
         * 参数一:Term term   Term是一个精确查找的值
         * 参数二:更新之后的Document对象
         * 注意:
         *     其实,Lucene并没有提供更新,其实这是“删除”,“添加”两个操作的合集
         * 下面代码的意思就是:更新“id”为“1”的索引,先将“id”为“1”的索引删除,再添加“id”为“11”的索引
         *
         * 注意:更新是把所有的索引都会重新生成一遍!!!!!!!
         */
        indexWriter.updateDocument(new Term("id", "2"), document);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        closeIndexWriter(indexWriter);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值