索引维护
1. 删除索引
1.1删除指定索引
根据Term项删除索引,满足条件的将全部删除。
@Test public void testIndexDelete() throws Exception { // 创建Directory流对象 Analyzer analyzer = new IKAnalyzer(); Directory directory = FSDirectory.open(new File("C:/itcast/lucene/index").toPath()); IndexWriterConfig config = new IndexWriterConfig(analyzer); // 创建写入对象 IndexWriter indexWriter = new IndexWriter(directory, config); // 根据Term删除索引库,name:java indexWriter.deleteDocuments(new Term("name", "java")); indexWriter.commit(); // 释放资源 indexWriter.close(); }
效果如下图:索引域没有变化,文档域数据被删除掉。
1.2 删除全部索引(慎用)
将索引目录的索引信息全部删除,直接彻底删除,无法恢复。
建议参照关系数据库基于主键删除方式,所以在创建索引时需要创建一个主键Field,删除时根据此主键Field删除。
索引删除后将放在Lucene的回收站中,Lucene3.X版本可以恢复删除的文档,3.X之后无法恢复。
代码:
@Test public void testIndexDelete() throws Exception { // 创建Directory流对象 Analyzer analyzer = new IKAnalyzer(); Directory directory = FSDirectory.open(new File("D:/index").toPath()); IndexWriterConfig config = new IndexWriterConfig(analyzer); // 创建写入对象 IndexWriter indexWriter = new IndexWriter(directory, config); // 根据Term删除索引库,name:java //indexWriter.deleteDocuments(new Term("name", "java")); indexWriter.deleteAll(); indexWriter.commit(); // 释放资源 indexWriter.close(); }
索引域数据清空,文档域数据也清空。
2 更新索引
更新索引是先删除再添加,建议对更新需求采用此方法并且要保证对已存在的索引执行更新,可以先查询出来,确定更新记录存在执行更新操作。
如果更新索引的目标文档对象不存在,则执行添加。
代码
@Test public void testIndexUpdate() throws Exception { // 创建分词器 Analyzer analyzer = new IKAnalyzer(); // 创建Directory流对象 Directory directory = FSDirectory.open(new File("D:/index").toPath()); IndexWriterConfig config = new IndexWriterConfig( analyzer); // 创建写入对象 IndexWriter indexWriter = new IndexWriter(directory, config); // 创建Document Document document = new Document(); document.add(new TextField("id", "1002", Field.Store.YES)); document.add(new TextField("name", "lucene测试test 002", Field.Store.YES)); // 执行更新,会把所有符合条件的Document删除,再新增。 indexWriter.updateDocument(new Term("name", "test"), document); // 释放资源 indexWriter.close(); }