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如果索引库存在进行追加,不存在会自动创建

参考博客:

  1. https://blog.csdn.net/jinwufeiyang/article/details/51817822
  2. https://blog.csdn.net/P397226804/article/details/69396370
  3. http://codepub.cn/2016/06/24/Lucene-6-0-in-action-the-index-of-hot-backup-and-recovery/  (该博主是阿里大牛,想学lucene可以看它文章,受益匪浅)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值