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