2012-03-29 194 views
11

我的服务器功率损失,lucene索引损坏。我拼命地跑IndexChecker但它失败:如何修复损坏的lucene索引?

java -cp /home/dthoai/programs/paesia/checker/lucene-core-3.5.0.jar -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex /mnt/peda/paesia/index -fix 


Opening index @ /mnt/peda/paesia/index 

ERROR: could not read any segments file in directory 
java.io.IOException: read past EOF: MMapIndexInput(path="/mnt/peda/paesia/index/segments_ls0l") 
at org.apache.lucene.store.MMapDirectory$MMapIndexInput.readByte(MMapDirectory.java:279) 
at org.apache.lucene.store.ChecksumIndexInput.readByte(ChecksumIndexInput.java:41) 
at org.apache.lucene.store.DataInput.readInt(DataInput.java:84) 
at org.apache.lucene.store.DataInput.readLong(DataInput.java:126) 
at org.apache.lucene.index.SegmentInfo.<init>(SegmentInfo.java:202) 
at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:286) 
at org.apache.lucene.index.SegmentInfos$1.doBody(SegmentInfos.java:363) 
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:754) 
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:593) 
at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:359) 
at org.apache.lucene.index.CheckIndex.checkIndex(CheckIndex.java:327) 
at org.apache.lucene.index.CheckIndex.main(CheckIndex.java:1007) 

我怎样才能修复我的Lucene索引?

+0

重建不是一个选项? – Reactormonk 2012-03-30 10:33:19

+0

你有没有试过在卢克打开索引? http://www.getopt.org/luke/ – Mikos 2012-03-30 22:30:44

回答

8

它看起来像主目录文件,segments_N已损坏。这可能意味着在提交进行时发生了电力损失。

如果是这种情况,这意味着您的目录中可能存在较旧的segments_N文件,并且引用的段仍然存在且有效。如果有这样一个文件,尝试删除您损坏segments_ls0l文件看看:

  • 的Lucene是否设法打开索引,
  • 你错过了什么数据。

否则,有一些线程一个Lucene用户邮件列表谈论重新生成segments_N文件。

进行任何修改之前,请务必备份您的目录。

+0

谢谢你的回答!我只是遇到了同样的问题,我删除了所有大小为0字节的损坏段。现在一切似乎都没问题。我担心的是,删除这些segmens_N文件是否安全,尽管它们只是0字节文件? – bbnn 2015-06-17 08:23:57

+0

我解决了这样的问题;停止ES。输入损坏的分片'/ var/lib/elasticsearch/elasticsearch/nodes/0/indices///index'。查找所有空文件'ls -l -S | sort -k 5 -n |头'并将其移除。再次启动ES。 – Oleander 2015-11-16 00:20:27