no segments* file found in SimpleFSDirectory问题总结
生活随笔
收集整理的這篇文章主要介紹了
no segments* file found in SimpleFSDirectory问题总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
lucene6.0版本
場景一:第一次啟動程序索引庫為空拋出異常
最近在寫lucene發現利用lucene6.0版本時候如果索引庫為空構建indexWriter,代碼如下:
IndexWrterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(config); IndexReader reader = IndexReader.open(directory);程序順序執行上面代碼塊是正常的,但是調用iIndexReader reader = IndexReader.open(directory);?后報錯“no segments* file”。
解決辦法:在獲取indexWriter對象后手動commit一次建立索引庫版本信息,最終問題解決!代碼如下:
IndexWrterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(config); indexWriter.commit();//手動提交一次 IndexReader reader = IndexReader.open(directory);場景二:提交文檔并提交以后再次啟動拋出異常
異常原因:可能是文件讀寫異常終止以后,程序再次啟動時候,lucene對索引庫進行合并讀取操作,信息缺失,索引庫讀取和合并操作失敗。
解決辦法:在indexWriter.commit()后沒有調用indexWriter.close()方法,此時文檔內容為空
場景三:程序異常終止(手動殺死進程,造成索引庫未寫入全)
解決辦法:可以用如下代碼修復索引,會幫你刪除損壞的索引文件
/*** @param source 索引源* @param dest 索引目標* @param indexWriterConfig 配置相關*/ public static void recoveryIndex(String source, String dest, IndexWriterConfig indexWriterConfig) {IndexWriter indexWriter = null;try {indexWriter = new IndexWriter(FSDirectory.open(Paths.get(dest)), indexWriterConfig);} catch (IOException e) {log.error("", e);} finally {//說明IndexWriter正常打開了,無需恢復if (indexWriter != null && indexWriter.isOpen()) {try {indexWriter.close();} catch (IOException e) {log.error("", e);}} else {//說明IndexWriter已經無法打開,使用備份恢復索引//此處簡單操作,先清空損壞的索引文件目錄,如果索引特別大,可以比對每個文件,不必全部刪除 try {FileUtils.deleteDirectory(new File(dest));FileUtils.copyDirectory(new File(source), new File(dest));} catch(IOException e){log.error("", e);//使用備份恢復出錯,那么就使用最后一招修復索引log.info("Check index {} now!", dest);try {IndexUtils.checkIndex(dest);} catch (IOException | InterruptedException e1) {log.error("Check index error!", e1);}}} }lucene8.2版本
場景一:第一次啟動程序索引庫為空拋出異常
第一次啟動索引庫未空的程序,程序拋出異常代碼如下:
IndexWriterConfig writerConfig = new IndexWriterConfig(analyzer);IndexWriter indexWriter = new IndexWriter(dic,writerConfig);解決方法:直接在IndexWriterConfig參數中配置索引庫不存在時候創建即可,代碼如下:
IndexWriterConfig writerConfig = new IndexWriterConfig(analyzer);writerConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);//解決IndexWriter indexWriter = new IndexWriter(dic,writerConfig);IndexReader reader = DirectoryReader.open(dic);說明:查詢了http://lucene.apache.org/core/8_2_0/core/index.html文檔,發現OpenMode有以下三個參數:
| APPEND | 索引庫版本信息(索引庫是否為空)存在則追加操作 |
| CREATE | 不管索引版本信息是否存在重新創建索引庫 |
| CREATE_OR_APPEND | 如果索引庫存在進行追加,不存在會自動創建 |
參考博客:
總結
以上是生活随笔為你收集整理的no segments* file found in SimpleFSDirectory问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程--聊天室客户端程序
- 下一篇: 【java机器学习】支持向量机之拉格朗日