本来想在这篇里把索引的优化和更新一起写,但写完标题后发现标题好长,所以在这里就暂时只写关于索引删除的内容吧。因为小弟学的也不深,所以写的也有些简单,还望见谅。
一、索引删除
关于索引删除,有两个类都可以完成,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
}
}
如此一来,就可以直接把想删除的索引删掉了。
总结:
上面三节简单介绍了索引的删除、恢复删除、彻底删除的操作,写的比较简单,没有详细介绍,至于具体的操作和效果,建议自己去测试,发现问题后问下谷老师,查的过程中可能还会学到其他东西哦,我就是这么干的,呵呵。至于以上我写的有任何问题和错误之处的话,还望指正,共同学习,谢谢。