背景
我在schema.xml
中配置了类似以下内容的Solr拼写检查程序:
<fieldType name="spell_field" class="solr.TextField">
<analyzer type="index">
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="3" max="255" />
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" />
<tokenizer class="solr.WhitespaceTokenizerFactory" />
</analyzer>
<analyzer type="query">
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="3" max="255" />
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" />
<tokenizer class="solr.WhitespaceTokenizerFactory" />
</analyzer>
</fieldType>
用于:
<field name="spellcheck" type="spell_field" indexed="true" stored="false" multiValued="true" />
,与solrconfig.xml
中的以下内容类似:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">dflt</str>
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.maxCollations">3</str>
<str name="spellcheck.collateMaxCollectDocs">1</str>
<str name="spellcheck.maxCollationTries">2</str>
</lst>
<arr name="last-components">
<str>suggest</str>
</arr>
</requestHandler>
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<str name="queryAnalyzerFieldType">spellcheck</str>
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="field">spellcheck</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<int name="minPrefix">1</int>
<int name="minQueryLength">3</int>
<int name="maxEdits">2</int>
<int name="maxInspections">3</int>
<int name="minQueryLength">3</int>
<float name="maxQueryFrequency">0.01</float>
<float name="thresholdTokenFrequency">.00001</float>
<float name="accuracy">0.5</float>
</lst>
</searchComponent>
问题
Solr有时会返回包含特殊字符的搜索结果作为第一个建议。这是一个问题,因为我的应用程序使用第一个来重建查询。
例如,如果我搜索&#34; VOLTAGER&#34;,Solr产生的第一个拼写建议是&#34;电压:&#34;,因此重建的查询看起来像myField:voltage:
。然后,在发送查询后,Solr的记录器显示以下警告:SpellCheckCollator: Exception trying to re-query to check if a spell check possibility would return any hits.
底层的Exception是一个解析错误,因为myField:voltage:
不是有效的查询。
&#34; VOLTAGER&#34;还会返回一个简单的&#34;电压&#34;,但在建议列表的下方,我的要求声明我必须从列表中获取第一个拼写更正。
理想情况下,在上面的例子中,&#34; VOLTAGER&#34;只会返回&#34;电压&#34;。
我尝试过的事情
我尝试将以下行添加到spell_field
字段类型的索引和查询分析器中:
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9])" replacement=""/>
这个 删除了拼写检查程序中的所有特殊字符,但它具有令人讨厌的副作用,同时也大大减少了拼写检查器返回的结果数量。例如,&#34; VOLTAGER&#34;不再回报任何东西。也没有&#34; circut&#34;,它通常会返回&#34;电路&#34;。
目前,我在Java应用程序中有以下连接到Solr的行:
correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");
它的工作原理是确保返回的内容没有特殊字符,但我宁愿配置Solr的拼写检查器来阻止首先使用特殊字符返回更正。
总结
我试图让Solr的拼写检查器停止在其建议中返回特殊字符。基本上我只想要回信。我如何实现我的目标?
答案 0 :(得分:1)
在我最初的问题中,我显然对谁造成了什么错误以及在哪里造成了一些困惑。最终的问题是Solr使用附加了非法ASCII字符的术语(通常是:
字符)自动测试校对。特殊字符并非来自整理,但是,它们只是由拼写检查器返回,即使我从分析的字段中删除了所有特殊字符,拼写检查器也会继续返回:
字符的一些建议追加。
我解决这个问题的方法就是删除整理器本身。所以现在我的拼写检查配置如下所示:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">dflt</str>
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.count">10</str>
</lst>
<arr name="last-components">
<str>suggest</str>
</arr>
</requestHandler>
在从Suggestion Map中检索建议时,我的代码中仍然有以下内容:
correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");
令人讨厌,但至少现在Solr并没有在每次整理器失败时抛出一堆例外,而且我的代码可以提供一个安全网,以确保没有任何非法的东西归结为Solr。
缺点是我现在必须自己进行整理,与Solr不同,我无法保证任何一种整理都会产生结果。也就是说,我对拼写检查程序的要求不是很重要,所以虽然这种行为是不可取的,但这并不是不可接受的。
如果有人遇到这个问题并在不删除整理器的情况下解决了这个问题,我会非常有兴趣了解它。