上一篇已经实现了索引的创建和查询
下面主要从删除和更新方面操作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(); } } } }