上一篇已经实现了索引的创建和查询
下面主要从删除和更新方面操作Lucene
删除主要有三种:
第一种:
//删除的操作
public void delete(){
//创建IndexWriter
IndexWriter writer=null;
try {
writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_4_9,
new StandardAnalyzer(Version.LUCENE_4_9)));
//参数是一个选项,可以是一个Query,也可以是一个term,term是一个精确查找的值
//此时删除的文档并不会被完全删除,二十存储在一个回收站中,可以被恢复
writer.deleteDocuments(new Term("id","1"));
//删除后提交
writer.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (writer != null) {
try {
// 关闭流
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第二种:
//删除的操作,清空回收站:我的理解就是删除的索引彻底删除,连回收站的也删除
public void forthDelete(){
//创建IndexWriter
IndexWriter writer=null;
try {
writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_4_9,
new StandardAnalyzer(Version.LUCENE_4_9)));
//参数是一个选项,可以是一个Query,也可以是一个term,term是一个精确查找的值
//此时删除的文档并不会被完全删除,二十存储在一个回收站中,可以被恢复
writer.forceMergeDeletes();
//删除后提交
writer.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (writer != null) {
try {
// 关闭流
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第三种:
//删除,将索引分为两个部分
public void merge(){
//创建IndexWriter
IndexWriter writer=null;
try {
writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_4_9,
new StandardAnalyzer(Version.LUCENE_4_9)));
//会将索引合并为两段,这两段中的被删除的数据会被清空
//特别注意此处Lucene在3.5之后不建议使用,因为会消耗大量开心,Lucene会根据情况自动清理
writer.forceMerge(2);
//删除后提交
writer.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (writer != null) {
try {
// 关闭流
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
对于更新操作,实际上市先删除后更新的操作:通过query查询方法我们可以看出来
//更新:
public void update(){
//创建IndexWriter
IndexWriter writer=null;
try {
writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_4_9,
new StandardAnalyzer(Version.LUCENE_4_9)));
/**
* Lucene并没有提供更新,这里的更新操作其实如下两个操作的合集
*
*/
Document doc=new Document();
// 4.为Document添加Field
doc.add(new Field("id","1",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("emails",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("contents",contents[0],Field.Store.NO,Field.Index.NOT_ANALYZED));
doc.add(new Field("names",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
// 4通过IndexWriter 添加文档到索引中
writer.updateDocument(new Term("id","1"), doc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (writer != null) {
try {
// 关闭流
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}