一、代码分析
/** * Lucene入门 * 操作索引 */ public class ManageIndex { public IndexWriter getIndexWriter() throws Exception { //设置索引库的位置 Directory directory = FSDirectory.open(new File("E:\zhanghaoBF\luceneSolr\indexLibrary").toPath()); Analyzer analyzer = new StandardAnalyzer();//创建分词器对象(官方推荐标准分词器) IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);//设置使用的分词器 return new IndexWriter(directory, indexWriterConfig);//索引对象 } /** * 全删除(PS:索引里面的文档也会删掉) * * @throws Exception */ @Test public void deleteAllIndex() throws Exception { IndexWriter indexWriter = getIndexWriter();//获取索引的流对象 indexWriter.deleteAll();//删除全部索引 indexWriter.close();//关流 } /** * 按条件删除(PS:索引里面的文档也会删掉) * * @throws Exception */ @Test public void deleteIndex() throws Exception { IndexWriter indexWriter = getIndexWriter();//获取索引的流对象 Query query = new TermQuery(new Term("fileContent", "lucene"));//PS:TermQuery为精准匹配 indexWriter.deleteDocuments(query);//按条件删除索引 indexWriter.close();//关流 } /** * 修改(PS:先删除后新增,与数据库里面的修改不一样,注意区分) * * @throws Exception */ @Test public void updateIndex() throws Exception { //获取索引的流对象 IndexWriter indexWriter = getIndexWriter(); //构建一个文档对象 Document doc = new Document(); doc.add(new TextField("fileName", "新的文件名称", Field.Store.YES)); doc.add(new TextField("fileContent", "新的文件内容", Field.Store.YES)); //调用更新操作,先把符合条件的索引删掉(包括term和存在索引库的文档),然后把刚才新增的文档对象加入到索引库中 indexWriter.updateDocument(new Term("fileName", "是"), doc);//按条件删除索引,再加入新的索引 //PS:删掉的文档还是会占用对应的文档ID,新增的文档排在最后(和数据库ID自增时的删除再添加一个道理) //关流 indexWriter.close(); } }
二、注意事项
1、删除的时候,索引库里对应ID下的term和文档都会删除。
2、修改操作其实是先把符合条件的term和文档都会删掉,然后再加入新的文档。
3、删掉的文档,文档ID不会释放,还是被占用的。
4、流用完一定要记得关。