Solr 建议词典不构建.Java 堆空间错误?



我在带有PostgreSQL数据库的Rails API上使用solr 5.3.1和sunspot 2.2.7。

几天来我一直在尝试配置自动建议/自动完成功能,但很难让它工作。我希望寻找"foob"返回建议"foobar company"。

我的schema.xml包含以下内容:

<copyField source="*_text"  dest="textSpell" />
<copyField source="*_text"  dest="autocomplete" />
<copyField source="*_s"  dest="textSpell" />

这允许我从太阳黑子创建的动态 Solr 字段中复制拼写检查(工作正常)和自动完成:

<dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>

这个动态字段包含我想使用的值:title_text

我的拼写检查和自动完成字段如下所示:

<field name="textSpell" stored="false" type="textSpell" multiValued="true" indexed="true"/>
<field name="autocomplete" stored="true" type="autocomplete" multiValued="true" indexed="true"/>

我的字段类型autocomplete如下所示:

<fieldType name="autocomplete" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

然后在 solrconfig 上.xml我有我的建议器组件:

<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">suggest</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="storeDir">suggester_fuzzy_dir</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">autocomplete</str>
<str name="suggestAnalyzerFieldType">autocomplete</str>
<str name="buildOnOptimize">true</str>
<str name="buildOnStartup">true</str>
<str name="buildOnCommit">false</str>
</lst>
</searchComponent>
<requestHandler name="/suggesthandler" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.dictionary">suggest</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>

我的基地中有 10M+ 个条目。我的目标是对标题属性进行自动建议。

此设置应该索引我的标题的两倍。事实上,当我使用这些设置重新编制索引时,我的索引大小翻了一番。

我确实有一个文件夹suggester_fuzzy_dir,它是在我的核心数据文件夹中创建的。 但是当我启动 solr 或启动请求/suggesthandler?suggest.build=true时,这个suggester_fuzzy_dir文件夹的大小不会增长,它总是包含 1 个字节。但是,磁盘上剩余的SSD存储空间正在减少,我无法看到从哪里。

45 分钟后,我通常会收到java heap space out of memory错误。 我的磁盘大小恢复正常。

我尝试使用选项 -memory=4096m 启动 solr 以分配更多(我的计算机有 8go RAM)。这仍然不起作用,尽管它应该足够了?这让我认为问题出在其他地方。

编辑:控制台中solr返回的错误如下:

{
"error": {
"msg": "java.lang.OutOfMemoryError: Java heap space",
"trace": "java.lang.RuntimeException: java.lang.OutOfMemoryError: 
Java heap spacentat org.apache.solr.servlet.HttpSolrCall.sendError(HttpSolrCall.java:618)ntat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:477)ntat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:214)ntat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:179)ntat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)ntat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)ntat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)ntat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)ntat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)ntat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)ntat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)ntat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)ntat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)ntat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)ntat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)ntat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)ntat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)ntat org.eclipse.jetty.server.Server.handle(Server.java:499)ntat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)ntat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)ntat org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)ntat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)ntat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)ntat java.lang.Thread.run(Thread.java:748)nCaused by: java.lang.OutOfMemoryError: Java heap spacentat org.apache.lucene.util.packed.Packed64.<init>(Packed64.java:73)ntat org.apache.lucene.util.packed.PackedInts.getMutable(PackedInts.java:1009)ntat org.apache.lucene.util.packed.PackedInts.getMutable(PackedInts.java:976)ntat org.apache.lucene.util.packed.GrowableWriter.<init>(GrowableWriter.java:46)ntat org.apache.lucene.util.packed.PagedGrowableWriter.newMutable(PagedGrowableWriter.java:58)ntat org.apache.lucene.util.packed.AbstractPagedMutable.fillPages(AbstractPagedMutable.java:60)ntat org.apache.lucene.util.packed.PagedGrowableWriter.<init>(PagedGrowableWriter.java:52)ntat org.apache.lucene.util.packed.PagedGrowableWriter.<init>(PagedGrowableWriter.java:45)ntat org.apache.lucene.util.fst.NodeHash.rehash(NodeHash.java:164)ntat org.apache.lucene.util.fst.NodeHash.add(NodeHash.java:133)ntat org.apache.lucene.util.fst.Builder.compileNode(Builder.java:215)ntat org.apache.lucene.util.fst.Builder.freezeTail(Builder.java:310)ntat org.apache.lucene.util.fst.Builder.add(Builder.java:417)ntat org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester.build(AnalyzingSuggester.java:557)ntat org.apache.lucene.search.suggest.Lookup.build(Lookup.java:193)ntat org.apache.solr.spelling.suggest.SolrSuggester.build(SolrSuggester.java:162)ntat org.apache.solr.handler.component.SuggestComponent.prepare(SuggestComponent.java:179)ntat org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:251)ntat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)ntat org.apache.solr.core.SolrCore.execute(SolrCore.java:2068)ntat org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:669)ntat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:462)ntat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:214)ntat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:179)ntat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)ntat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)ntat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)ntat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)ntat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)ntat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)ntat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)ntat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)n",
"code": 500
}
}

所以我最终通过增加分配给 Java 虚拟机的内存来使其工作。

在太阳黑子中:

development:
solr:
hostname: localhost
port: 8982
log_level: INFO
path: /solr/development
memory: 6G   # => This allocate 6g RAM to the JVM

它可能适用于 4 go 内存分配,想。我实时检查了构建,有一些内存使用峰值超过 2g,有时是 3g。

我的suggester_fuzzy_dir现在重 1.3 go,这更合乎逻辑。

最新更新