Solr:Spellcheck上的NullPointerException(FSTCompletionLookup)

时间:2014-06-05 16:19:29

标签: solr solr4

我在solr-user邮件列表上发布了这个,但是没有听到反馈,所以FBOW我尝试了。对不起,交叉发布。

问题

Solr'建议/拼写检查'组件在用户执行搜索时抛出NullPointerException(NPE)。它在FSTCompletionLookup上失败(第244行)

更新 这是配置错误。

在我的急速/粗心大意中,而不是定义单独的"拼写检查"并且"建议"组件,我只定义"建议"。 (更具体地说,我复制了" solr in action"中的ch10示例,但没有复制"拼写检查"组件。")

当solr抱怨没有找到'拼写检查'组件,我查看了我的(坏)solrconfig.xml并想到了"嗯。 '拼写检查...组件可能应该建议'"。它在重新索引之后起作用..并且似乎正常运行。

打开硬拷贝,坐在安乐椅上,仔细查看章节,引起了我的注意。

问题

  • 我怎样才能超越这个?缓存变暖?术语载体?

上下文

  • Solr 4.4。 (我使用4.4匹配"生产中的内容。"如果需要,我可以升级到最新版本。)
  • 基本上我应用Solr in Action中的示例,我的配置与示例匹配。
  • 结果不一致:如果我重新索引网站,然后运行特定搜索,则会成功。但是,如果我重新启动Solr,则相同的查询将失败并显示NPE

字典详情

The Suggester使用目前开放的搜索者'建立它的字典。这可能解释了上面的“不一致”[在重新启动后搜索给出NPE,长时间运行的实例成功]

  reader = searcher.getIndexReader();
  dictionary = new HighFrequencyDictionary(reader, field, threshold);

请求处理程序配置

  <str name="spellcheck">on</str>
  <str name="spellcheck.dictionary">suggestDictionary</str>        
  <str name="spellcheck.extendedResults">false</str>
  <str name="spellcheck.count">5</str>
  <str name="spellcheck.alternativeTermCount">2</str>
  <str name="spellcheck.maxResultsForSuggest">5</str>
  <str name="spellcheck.collate">true</str>
  <str name="spellcheck.collateExtendedResults">true</str>
  <str name="spellcheck.maxCollationTries">5</str>
  <str name="spellcheck.maxCollations">3</str>

拼写检查组件

<searchComponent class="solr.SpellCheckComponent" name="suggest">
    <lst name="spellchecker">
        <str name="name">suggestDictionary</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.FSTLookupFactory</str>
        <str name="field">title</str>           
     <!--   <str name="field">suggest</str> -->
        <float name="threshold">0.</float>
        <str name="buildOnCommit">true</str>
    </lst>
</searchComponent>

字段类型定义

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <!-- Use EdgeNGramFilter for wildcard search -->
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

字段定义

提前致谢

1 个答案:

答案 0 :(得分:0)

我还有一个与FSTCompletionLookup建议组件的NPE问题,不记得MPE原因的确切行号,我想通过(我的配置和solr使用FSTCompletionLookup的自定义实现)这是因为FSTCompletionLookup建议字典在启动时没有创建,但在启动后重新加载核心后可以使用它。

{solr-version}:4.7.x +

我在启动时添加了以下配置构建建议,希望这有帮助

<query>
    <listener event="firstSearcher" class="solr.QuerySenderListener">
      <arr name="queries">
        <lst> <str name="qt">/suggest</str>
                <str name="spellcheck.build">true</str>
        </lst>
      </arr>
    </listener>

</query>