【发布时间】: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 组件。感谢您查看问题。