【问题标题】:Solr: NullPointerException on Spellcheck (FSTCompletionLookup)Solr:拼写检查上的 NullPointerException (FSTCompletionLookup)
【发布时间】:2014-06-05 16:19:28
【问题描述】:

我在 solr-user 邮件列表上发布了这个,但还没有收到反馈,所以我正在尝试 FBOW。很抱歉交叉发布。

问题

当用户执行搜索时,Solr 的“建议/拼写检查”组件会引发 NullPointerException (NPE)。它在 FSTCompletionLookup 上失败(第 244 行)

更新 这是一个配置错误。

在我匆忙/粗心的情况下,我没有定义单独的“拼写检查”和“建议”组件,而是只定义了“建议”。 (更具体地说,我复制了“solr in action”中的 ch10 示例,但没有复制“拼写检查”组件。”)

当 solr 抱怨找不到 'spellcheck' 组件时,我查看了我的(错误的)solrconfig.xml 并认为“嗯。'spellcheck..component 可能应该是 'suggest'”。它在重新索引后工作..并且似乎正常工作。

打开纸质版,坐在安乐椅上,仔细翻阅这一章,引起了我的注意。

问题

  • 我怎样才能克服这个问题?缓存变暖?术语向量?

上下文

  • Solr 4.4。 (我使用 4.4 来匹配“生产中的内容”。如有必要,我可以升级到最新版本。)
  • 基本上我正在应用 Solr in Action 中的示例,并且我的配置与示例匹配。
  • 不一致的结果:如果我重新索引站点,然后运行特定搜索,它会成功。但是,如果我重新启动 Solr,相同的查询会因 NPE 而失败

字典详情

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>

字段定义

提前致谢

【问题讨论】:

  • 您可以将完整的堆栈跟踪添加到问题中吗?
  • 我用解决方案更新了上面的问题:混合了我的 Suggester 和 Spellcheck 组件。感谢您查看问题。

标签: solr solr4


【解决方案1】:

我也遇到了 FSTCompletionLookup 建议组件的 NPE 问题,不记得 MPE 原因的确切行号,我发现(我的配置和 solr 正在使用 FSTCompletionLookup 的自定义实现)这是因为 FSTCompletionLookup 建议字典不是在启动时创建的,但在启动后重新加载核心后可用。

{solr-版本}:4.7.x+

我添加了以下在启动时构建建议 dic 的配置,希望对您有所帮助

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多