2、学习lucene之索引删除、恢复删除、强制删除

        本来想在这篇里把索引的优化和更新一起写,但写完标题后发现标题好长,所以在这里就暂时只写关于索引删除的内容吧。因为小弟学的也不深,所以写的也有些简单,还望见谅。

        一、索引删除

        关于索引删除,有两个类都可以完成,IndexWriter和IndexReader。当我了解到这个问题时,纠结了半天到底用哪个,后来问了谷老师,他帮我找到了答案,最好是用IndexWriter,为么啊?在我转来的那篇“Lucene中删除索引是用IndexWriter还是用IndexReader”中仔细写了原因,在此就不多说了。如何进行删除,分四步走战略。

        1、创建Directory,索引的存放位置

        2、创建IndexWriter

        3、删除索引

        4、关闭IndexWriter

附上代码:

下面代码中,删除的是建索引时,id的Field中,内容为1的记录。

package com.hlp.lucene.deleteIndex;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 功能:删除索引
 *
 */
public class DeleteIndex
{
    // 索引的存放位置
    String luceneIndex = "G://lucene//luceneIndex2";

    // 分词器
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

    public void delIndex()
    {
	IndexWriter indexWriter = null;
	try
	{
	    // 1、创建Directory,索引的存放位置
	    Directory directory = FSDirectory.open(new File(luceneIndex));

	    // 2、创建IndexWriter
	    IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
	    indexWriter = new IndexWriter(directory, iwConfig);

	    // 3、删除索引,这样并不会完全删除,可以恢复
	    indexWriter.deleteDocuments(new Term("id", "1"));
	}
	catch (CorruptIndexException e)
	{
	    e.printStackTrace();
	}
	catch (IOException e)
	{
	    e.printStackTrace();
	}finally
	{
	    // 4、关闭IndexWriter
	    if(null != indexWriter)
	    {
		try
		{
		    indexWriter.close();
		}
		catch (IOException e)
		{
		    e.printStackTrace();
		}
	    }
	}  // end finally

    } // end getIndexInfor
}
上面这种方式执行完毕后,其实索引并没有完全删除,虽然搜索的时候已经搜索不到了,就貌似在电脑上删除文件后先放在回收站一样,其实,这个索引也被放在了lucene的“回收站”,可以进行恢复,除非再执行强制删除才会完全删除。

        二、索引恢复

        上面也谈到了,用上面方法删除的索引是可以进行恢复的。同样,也分为四步走战略。
        1、创建Directory,索引的存放位置
        2、创建IndexReader,必须把对索引的只读设置为false
        3、恢复删除的索引内容
        4、关闭IndexReader
        以下是代码展示:
package com.hlp.lucene.deleteIndex;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 功能:恢复索引
 *
 */
public class UndeleteIndex
{
    // 索引的存放位置
    String luceneIndex = "G://lucene//luceneIndex2";

    // 分词器
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

    public void unDeleteIndex()
    {
	IndexReader indexReader = null;

	try
	{
	    // 1、创建Directory,索引的存放位置
	    Directory directory = FSDirectory.open(new File(luceneIndex));

	    // 2、创建IndexReader,必须把对索引的只读设置为false
	    indexReader = IndexReader.open(directory, false);
	    
	    // 3、恢复删除的索引内容
	    indexReader.undeleteAll();
	}
	catch (CorruptIndexException e)
	{
	    e.printStackTrace();
	}
	catch (IOException e)
	{
	    e.printStackTrace();
	}finally
	{
	    // 4、关闭IndexReader
	    try
	    {
		indexReader.close();
	    }
	    catch (IOException e)
	    {
		e.printStackTrace();
	    }
	} // end finally
    }


}

这样恢复删除后,会把所有在lucene“回收站”中的索引都恢复回去。
        

        三、强制删除索引

        上面所写的删除会先放到lucene“回收站”中,那么能不能一下就删除了呢?答案是可以的。下面就来演示下,用四步走方法。
        1、创建Directory,索引的存放位置
        2、创建IndexWriter
        3、强制删除没有完全删除的索引
        4、关闭IndexWriter

下面是代码演示:

package com.hlp.lucene.deleteIndex;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

/**
 * 功能:强制删除索引
 *
 */
public class ForceDelete
{
    // 索引的存放位置
    String luceneIndex = "G://lucene//luceneIndex2";

    // 分词器
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

    public void forceDelIndex()
    {
	IndexWriter indexWriter = null;

	try
	{
	    // 1、创建Directory,索引的存放位置
	    Directory directory = FSDirectory.open(new File(luceneIndex));

	    // 2、声明IndexWriter
	    // 2.1、声明IndexConfig对象
	    IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
	    // 2.2、声明IndexWriter对象
	    indexWriter = new IndexWriter(directory, iwConfig);
	    
	    // 3、强制删除没有完全删除的索引
	    indexWriter.forceMergeDeletes();
	}
	catch (CorruptIndexException e)
	{
	    e.printStackTrace();
	}
	catch (LockObtainFailedException e)
	{
	    e.printStackTrace();
	}
	catch (IOException e)
	{
	    e.printStackTrace();
	}finally
	{
	    // 4、关闭IndexWriter
	    try
	    {
		indexWriter.close();
	    }
	    catch (CorruptIndexException e)
	    {
		e.printStackTrace();
	    }
	    catch (IOException e)
	    {
		e.printStackTrace();
	    }
	}  // end finally

    }


}

如此一来,就可以直接把想删除的索引删掉了。


总结:
         上面三节简单介绍了索引的删除、恢复删除、彻底删除的操作,写的比较简单,没有详细介绍,至于具体的操作和效果,建议自己去测试,发现问题后问下谷老师,查的过程中可能还会学到其他东西哦,我就是这么干的,呵呵。至于以上我写的有任何问题和错误之处的话,还望指正,共同学习,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值