一般索引文档的更新采用删除后追加的方式 package lucene.test.index; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexWriter.MaxFieldLength; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocCollector; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; //索引文档更新 public class IndexUpdate2 { private static String IndexPath ="D://workshop//TextIndex1"; private static String FilePath = "D://MajorSoft//lucene//temp//FilePath//test1.txt"; private static String UpdatePath ="D://MajorSoft//lucene//temp//FilePath//test2.txt"; public static void main(String[] args) { try { File file = new File(FilePath); // 原始文件 Directory dir = FSDirectory.getDirectory(IndexPath); // 索引目录 Analyzer analyzer = new StandardAnalyzer(); // 文档分析器 IndexWriter writer1 = new IndexWriter(dir,analyzer,true,MaxFieldLength.UNLIMITED); // 生成索引器对象 writer1.setUseCompoundFile(true); Document document = new Document(); // 新建空文档 Field field_name = new Field("path", file.getName(), Field.Store.YES,Field.Index.ANALYZED); document.add(field_name); // 添加文件名域 FileInputStream inputfile=new FileInputStream(file); // 文件输入流 int len=inputfile.available(); byte[] buffer = new byte[len]; inputfile.read(buffer); // 读取文件内容 inputfile.close(); String content1 = new String(buffer); Field field_content = new Field( "content", content1, Field.Store.YES,Field.Index.ANALYZED ); document.add(field_content); // 添加文件内容域 writer1.addDocument(document); // 添加索引文档 writer1.optimize(); writer1.close(); display(file.getName()); // 输出替换前结果 IndexWriter writer2 = new IndexWriter(dir,analyzer,true,MaxFieldLength.UNLIMITED); // 重建索引器 writer2.setUseCompoundFile(true); File file2 = new File(UpdatePath); Document document2 = new Document(); // 生成空文档对象 Field field_name2 = new Field("path", file2.getName(), // 生成文件名域 Field.Store.YES,Field.Index.NOT_ANALYZED); document2.add(field_name2); FileInputStream inputfile2=new FileInputStream(file2); // 读取文件内容 int len2=inputfile2.available(); byte[] buffer2 = new byte[len2]; inputfile2.read(buffer2); inputfile2.close(); String content2 = new String(buffer2); Field field_content2 = new Field( "content", content2, Field.Store.YES,Field.Index.ANALYZED ); document2.add(field_content2); // 添加文件内容域 //Term term = new Term("path", file.getName() ); // 新建语汇单元 Term term = new Term("content2", "Lucene" ); // 新建语汇单元 writer2.updateDocument(term, document2); // 替换原有匹配文档 writer2.optimize(); writer2.close(); display(file2.getName()); // 输出替换后结果 } catch (IOException e) { e.printStackTrace(); } } @SuppressWarnings("deprecation") public static void display(String words) throws IOException { // 显示结果 try { IndexSearcher searcher = new IndexSearcher(IndexPath); // 检索器 Term term = new Term("path", words ); // 单词项 Query query = new TermQuery(term); // 检索单元 System.out.println("Query words****"+query.toString()); int hitsPerPage=100; TopDocCollector collector=new TopDocCollector(hitsPerPage); searcher.search(query, collector); ScoreDoc[] hits=collector.topDocs().scoreDocs; // 提交检索 System.out.println("Search result:"); for(int i=0; i < hits.length; i++) // 输出结果 { Document doc=searcher.doc(hits[i].doc); if(doc.getField("content")!=null) System.out.println("Content: "+":"+doc.getField("content").stringValue()); System.out.println("Path: "+doc.getField("path").stringValue()); } } catch (IOException e) { e.printStackTrace(); } } } /* lucene没有全功能的更新数据的函数 IndexWriter中updateDocument函数,使用Term实例来查找符合条件的文档 并以制定的新文档替换索引中的旧文档 只能管理部分索引 在索引创建完成后市无法维护全部数据的*/