我使用solr和tomcat作为servlet。我设置solr只使用一个核心,并定义了一个DIH来从mysql表中逐行导入文档。 一切都很好,工作得很好。文档被正确编入索引,我可以在' em中搜索。
问题在于我尝试使用建议模块,但是我第一次使用这样的网址构建需要构建的问题:
http://user:pass@localhost:port/solr/corename/suggest?q=whatever&spellcheck.build=true
我遗漏了一条重要的信息:目前导入的数据是470万条记录。
首先,它无法为100万个文档构建拼写检查字典(如果这就是它所构建的),因为jvm将耗尽堆内存,并显示以下消息:
java.lang.OutOfMemoryError: GC overhead limit exceededjava.lang.RuntimeException:
java.lang.OutOfMemoryError: GC overhead limit exceeded at
org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:793) at
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:434) at
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:207) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at
所以我逐渐增加堆内存,现在它大约2GB,我认为这很多。
当然,显而易见的解决办法是再次增加java的堆内存,但如果有任何方法可以划分和征服字典构建过程,我会徘徊吗? 或任何其他解决方案。
非常感谢
答案 0 :(得分:0)
1)对拼写检查索引大小有很大影响的参数是“thresholdTokenFrequency”。将以下参数添加到SpellCheckComponent配置可能是一种补救措施:
<float name="thresholdTokenFrequency">.01</float>
2)如果拼写检查字段中的数据是从不同的其他字段复制的,您可以尝试设置不同的SpellCheckComponents,每个字段在单独的字段上运行。
没试过这个,我担心合并不同的SpellCheckComponents的结果可能会非常棘手。
答案 1 :(得分:0)
Solr在构建索引时需要大量内存,例如拼写检查 - 索引。
因为这不是为机器增加更多内存的方法。
我遇到了同样的问题并且发现,增加虚拟内存将解决问题。
您可以使用ulimit -v
来显示虚拟内存的当前状态。
在我的情况下,对于5GByte索引是14GByte,哪个战争不够(10Million docs)
所以我把ulimit -v unlimited
放在tomcat启动脚本的开头。这解决了我的问题。