背景
我有一个Solr拼写检查器,其配置如下schema.xml
:
<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有时会返回带有特殊字符的搜索结果作为第一个建议。这是一个问题,因为我的应用程序使用第一个重建查询。
例如,如果我搜索“ VOLTAGER”,那么Solr产生的第一个拼写建议是“ voltage:”,因此重建的查询看起来像myField:voltage:
。然后,在发送查询之后,Solr的记录器将显示以下警告:SpellCheckCollator: Exception trying to re-query to check if a spell check possibility would return any hits.
底层的Exception是一个解析错误,因为myField:voltage:
它不是有效的查询。
“ VOLTAGER”也返回一个普通的“ voltage”,但在建议列表的更下方,并且我的要求状态是必须从列表中进行第一次拼写更正。
理想情况下,在上面的示例中,“ VOLTAGER”将仅返回“电压”。
我尝试过的
我尝试将以下行添加到spell_field
字段类型的索引和查询分析器中:
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9])" replacement=""/>
这确实从拼写检查器中删除了所有特殊字符,但是它的副作用还在于,它急剧减少了从拼写检查器返回的结果数量。例如,“ VOLTAGER”不再返回任何内容。通常返回“电路”的“ circut”也不起作用。
当前,我在连接到Solr的Java应用程序中具有以下行:
correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");
它可以通过确保返回的内容没有特殊字符来工作,但是我宁愿将Solr的拼写检查器配置为首先停止返回具有特殊字符的更正。
总之
我正在尝试让Solr的拼写检查器停止在其建议中返回特殊字符。基本上我只想退回信件。我如何实现自己想要的?
在我最初的问题中,我显然对谁造成什么错误以及在哪里造成错误感到困惑。最终的问题是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>
并且从“建议映射”中检索建议时,我的代码中仍然包含以下内容:
correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");
烦人的,但至少现在,每次整理器失败时,Solr都不会引发很多异常,并且我的代码可以提供一个安全网,以确保没有任何非法行为可以归结到Solr。
缺点是我现在必须自己进行归类,与Solr不同,我不能真正保证任何一个归类都会产生结果。就是说,我对拼写检查器的要求不是很重,因此尽管这种行为是不希望的,但也不是不可接受的。
如果有人遇到了这个问题并在不删除整理器的情况下解决了这个问题,那么我将非常有兴趣听到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句