(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);
}
}