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

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    }}

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



总结:

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

推荐阅读