我有大约300,000条记录要上传到solr云建议器上。这些记录是动态的,即将添加新文件,并且将来会定期删除某些文件。我面临的问题是:
使用FileDictionaryFactory:这种方法是一个可操作的噩梦。我需要继续生成文件并将其上传到zookeeper(仍然没有想出如何将像这样的巨大文件上传到zookeeper)。并且可能需要分别在solr云上的每个服务器上创建索引。经常这样做是不可能的。
使用DocumentDictionaryFactory:这个方法似乎是一个明显的选择,但这里构建索引也是一场噩梦。每当我尝试构建索引时,我都会得到"设备上没有空间"错误。我尝试在5K记录上构建它并且它成功了。但是整整40分钟耗费了40分钟并消耗了所有10GB的内存。
我的问题是,如果我们遵循第二种方法,我们能否优化这个指数构建时间。 或者,如果我遵循第一种方法,应该是处理频繁更改以在solr云上编制索引的理想方法。
我的配置:
对于FileDictionaryFactory:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">suggestions</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">FileDictionaryFactory</str>
<str name="field">searchfield</str>
<str name="weightField">searchscore</str>
<str name="suggestAnalyzerFieldType">text_ngram</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<str name="sourceLocation">spellings.txt</str>
<str name="storeDir">autosuggest_dict</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
<str name="suggest.dictionary">suggestions</str>
<str name="suggest.dictionary">results</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
对于DocumentDictionaryFactory:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">suggestions</str>
<str name="lookupImpl">FuzzyLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">searchfield</str>
<str name="weightField">searchscore</str>
<str name="payloadField">payload</str>
<str name="suggestAnalyzerFieldType">text_ngram</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
<str name="sourceLocation">spellings.txt</str>
<str name="storeDir">autosuggest_dict</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
<str name="suggest.dictionary">suggestions</str>
<str name="suggest.dictionary">results</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
答案 0 :(得分:0)
我认为DocumentDictionaryFactory的主要问题(这是我的首选选项)是你使用的是text_ngram。如果你的值不是很短,这将产生(我猜你没有共享text_ngram定义)一个非常大的FST,因此是创建它的时间。
除非我遗漏了某些内容,否则您不需要这样做,只需使用一些使用StandardTokenizerFactory标记的类型,并且建议应该有效。