Solr numDocs溢出

Solr numDocs溢出,solr,lucene,Solr,Lucene,我们正在运行Solr来索引大量数据,但遇到了一个非常有趣的问题,我在任何地方都找不到任何帮助 Solr似乎正在使用一个有符号的32位整数来计算索引中当前的文档数。我们刚刚达到这个数字,我们的Solr统计页面显示如下: numDocs : -2116382092 maxDoc : -2114669444 Solr似乎仍然能够很好地索引传入的数据,但当我们搜索时,会得到一个NegativeArraySizeException(参见下面的stacktrace) 我们假设错误和溢出是相互关联的(我相

我们正在运行Solr来索引大量数据,但遇到了一个非常有趣的问题,我在任何地方都找不到任何帮助

Solr似乎正在使用一个有符号的32位整数来计算索引中当前的文档数。我们刚刚达到这个数字,我们的Solr统计页面显示如下:

numDocs : -2116382092
maxDoc : -2114669444 
Solr似乎仍然能够很好地索引传入的数据,但当我们搜索时,会得到一个NegativeArraySizeException(参见下面的stacktrace)

我们假设错误和溢出是相互关联的(我相信这是一个公平的假设)。 Solr文档中没有任何内容,到目前为止,我还没有找到关于这个主题的任何相关帮助。这个问题的解决方案很可能是删除一块索引以将大小减小到MAX_INT以下,但我们不确定这是否有效,因为Solr很可能必须执行搜索才能找到要删除的文档

我想这与其说是一个问题,不如说是一个陈述事实的问题,但我想知道是否有其他人遇到过这个问题,如果有,你是如何解决的?

 java.lang.NegativeArraySizeException
    at org.apache.solr.search.DocSetCollector.<init>(DocSetHitCollector.java:47)
    at org.apache.solr.search.SolrIndexSearcher.getDocSetNC(SolrIndexSearcher.java:627)
    at org.apache.solr.search.SolrIndexSearcher.getPositiveDocSet(SolrIndexSearcher.java:563)
    at org.apache.solr.search.SolrIndexSearcher.getDocSet(SolrIndexSearcher.java:592)
    at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:903)
    at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:884)
    at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:341)
    at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
    at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195)
    at    org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at     org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at     org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:662)
java.lang.NegativeArraySizeException
位于org.apache.solr.search.DocSetCollector(DocSetHitCollector.java:47)
位于org.apache.solr.search.solrindexearcher.getDocSetNC(solrindexearcher.java:627)
在org.apache.solr.search.solrindexearcher.getPositiveDocSet(solrindexearcher.java:563)
位于org.apache.solr.search.solrindexearcher.getDocSet(solrindexearcher.java:592)
位于org.apache.solr.search.solrindexearcher.getDocListNC(solrindexearcher.java:903)
位于org.apache.solr.search.solrindexearcher.getDocListC(solrindexearcher.java:884)
位于org.apache.solr.search.solrindexearcher.search(solrindexearcher.java:341)
位于org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
位于org.apache.solr.handler.component.SearchHandler.HandlerRequestBody(SearchHandler.java:195)
位于org.apache.solr.handler.RequestHandlerBase.HandlerRequest(RequestHandlerBase.java:131)
位于org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
位于org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
位于org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
位于org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
位于org.jboss.web.tomcat.security.jaccontextvalve.invoke(jaccontextvalve.java:92)
位于org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
位于org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
位于org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
运行(Thread.java:662)

您是否尝试过使用分布式搜索

“如果由于内存或索引大小的原因,您有太多文档,无法将它们全部放在一个框中,那么您可以将索引拆分为多个片段,称为碎片。”Lucidworks


经过一番努力,我们终于解决了这个问题

我们做了什么以及如何解决它

首先,我们运行CheckIndex来验证所有的段和索引本身都处于良好状态,并且没有损坏。这也让我们知道,我们有足够的RAM,可以在以后对更大的细分市场进行一些真正的工作。如前所述,检查索引的结果是正常的检查索引在Lucene库中提供

第二步是将索引分成两部分(而不是一半)。 在我们的例子中,我们有一个巨大的片段,由大约17亿个文档组成,我们只是将该片段从源索引中分离出来,并创建了两个新索引,一个是大片段,另一个是我们剩下的20多个片段。 为此,我们使用了同样来自Lucene库的indexSpliter

拆分索引需要Lucene 3.0.x,我们只安装了Lucene 2.9.3(与Solr 1.4.1捆绑在一起)。我们下载了Lucene 3.0.3的一个单独实例,以获得IndexSpliter。 创建的两个新索引与我们的Lucene版本不兼容,因此我们不得不将Solr安装中的Lucene升级到2.9.4,该版本可以读取3.0.x索引

然后我们引导Solr指向每个新索引,一次一个。这次numDocs低于MAX_INT,我们可以运行delete语句。 在对这两个新索引执行此操作后,我们只需使用Lucene libra中的IndexMerge工具将它们合并在一起