如何在solr云建议器上优化documentdictionary构建?

时间:2016-12-01 08:39:15

标签: solr apache-zookeeper spell-checking solrcloud

我有大约300,000条记录要上传到solr云建议器上。这些记录是动态的,即将添加新文件,并且将来会定期删除某些文件。我面临的问题是:

  1. 使用FileDictionaryFactory:这种方法是一个可操作的噩梦。我需要继续生成文件并将其上传到zookeeper(仍然没有想出如何将像这样的巨大文件上传到zookeeper)。并且可能需要分别在solr云上的每个服务器上创建索引。经常这样做是不可能的。

  2. 使用DocumentDictionaryFactory:这个方法似乎是一个明显的选择,但这里构建索引也是一场噩梦。每当我尝试构建索引时,我都会得到"设备上没有空间"错误。我尝试在5K记录上构建它并且它成功了。但是整整40分钟耗费了40分钟并消耗了所有10GB的内存。

  3. 我的问题是,如果我们遵循第二种方法,我们能否优化这个指数构建时间。 或者,如果我遵循第一种方法,应该是处理频繁更改以在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>
    

1 个答案:

答案 0 :(得分:0)

我认为DocumentDictionaryFactory的主要问题(这是我的首选选项)是你使用的是text_ngram。如果你的值不是很短,这将产生(我猜你没有共享text_ngram定义)一个非常大的FST,因此是创建它的时间。

除非我遗漏了某些内容,否则您不需要这样做,只需使用一些使用StandardTokenizerFactory标记的类型,并且建议应该有效。