【问题标题】:How to repair corrupted lucene index?如何修复损坏的lucene索引?
【发布时间】:2012-03-29 23:41:38
【问题描述】:

我的服务器断电,lucene 索引已损坏。我运行了 IndexChecker 但它失败了:

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 索引?

【问题讨论】:

标签: lucene


【解决方案1】:

看起来主目录文件segments_N 已损坏。这可能意味着在提交运行时发生了断电。

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

  • Lucene 是否设法打开索引,
  • 您缺少哪些数据。

否则,一个 Lucene 用户邮件列表中有一些线程在讨论重新生成 segment_N 文件。

确保在进行任何修改之前备份您的目录。

【讨论】:

  • 感谢您的回答!我刚刚遇到了同样的问题,我删除了所有大小为 0 字节的损坏段。现在一切似乎都很好。我担心的是删除那些 segmens_N 文件是否安全,尽管它们只是 0 字节文件?
  • 我这样解决了问题;停止 ES。输入损坏的分片/var/lib/elasticsearch/elasticsearch/nodes/0/indices/&lt;?&gt;/&lt;?&gt;/index。找到所有空文件ls -l -S | sort -k 5 -n | head 并删除它们。重新启动 ES。
【解决方案2】:

作为 jpountz 先生的回答,我解决了损坏的 lucene 索引。

这是我们日志的错误:

> 2020-11-11 12:52:06,119 (BasicLuceneIndexer.java:87) 信息 com.softslate.commerce.businessobjects.product.BasicLuceneIndexer - 重新索引产品。 > 2020-11-11 12:52:06,119 (BasicLuceneIndexer.java:59) INFO com.softslate.commerce.businessobjects.product.BasicLuceneIndexer - 将新索引写入:/app/etalaze_staging/apache-tomcat-8.0.17/webapps /jatis.etalaze.community/WEB-INF/lucene/new > 2020-11-11 12:52:06,171 (BaseRequestProcessor.java:605) 警告 com.softslate.commerce.customer.core.BaseRequestProcessor - 异常如下: > org.apache.lucene.index.CorruptIndexException:段文件中的校验和不匹配 > 在 org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:248) > 在 org.apache.lucene.index.IndexFileDeleter.(IndexFileDeleter.java:175) > 在 org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1109) > 在 org.apache.lucene.index.IndexWriter.(IndexWriter.java:626) > 在 com.softslate.commerce.businessobjects.product.BasicLuceneIndexer.getIndexWriter(BasicLuceneIndexer.java:62) > 在 com.softslate.commerce.businessobjects.product.BasicLuceneIndexer.reindex(BasicLuceneIndexer.java:88) > 在 com.softslate.commerce.administrator.product.LuceneAddAllAction.execute(LuceneAddAllAction.java:44) > 在 org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425) > 在 org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228) > 在 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) > 在 org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) > 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:644) > 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725) > 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) > 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) > 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) > 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > 在 com.softslate.commerce.administrator.core.AdministratorFilter.doFilter(AdministratorFilter.java:44) > 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) > 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > 在 com.softslate.commerce.customer.core.SEOFilter.doFilter(SEOFilter.java:92) > 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) > 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > 在 com.softslate.commerce.customer.core.HibernateFilter.doFilter(HibernateFilter.java:75) > 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) > 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) > 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) > 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) > 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) > 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) > 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) > 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) > 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) > 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) > 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) > 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) > 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) > 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) > 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > 在 java.lang.Thread.run(Thread.java:745)

我想告诉你它背后的故事,以便更多地理解。 2020 年 10 月 27 日上午 11 时 18 分,我们办公室停电。我认为这是导致 lucene 索引损坏的原因。也许,提交失败。

每次我们提交重新索引时,都会产生上述错误并创建新段。它一遍又一遍地重复,直到 2020 年 11 月 11 日。在 lucene/new 目录中,有 44 个分段文件(例如,segments_1、segments_2、segments_3、...segments_N)。

解决方案: 我在lucene文件夹上做了备份。然后删除除了最新的segments_N文件和segments.gen之外的所有segements_N文件。我保留了这两个文件。

最后,错误不再出现。一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多