4、学习Lucene3.5之索引删除、更新
4、学习Lucene3.5之索引删除、更新
(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); }}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~