我试图找到一种方法来改进 Solr 提供的拼写建议,同时尽可能多地保留好的建议。一项特殊的搜索让我非常头疼:
“黄花”
搜索此 Solr 时提供建议“黄色花”
据我所知,这是来自该领域的一个部分,用于生成看起来像“鲜花。它”的建议
这只是我在这个特定查询中遇到的许多问题中的一个(我相信他们还有很多其他问题,但我专注于解决这个问题)。以前,我在使用省略号连接单词时遇到问题,例如:
"花...a" => "黄花a"
我已经厌倦了各种事情,比如在查询中添加 spellcheck.accuracy ,但我发现这在排除无效建议之前排除了有效建议(它在 0.7 时排除了“acet”=>“acer”,但没有排除“flowerse” "直到 0.9)。我试过 onlyMorePopular 对真和假,都没有明显的效果。
我正在考虑尝试使用 thresholdTokenFrequency,但我感觉我会失去很多有效的建议,比如可能只出现在索引中一次的专有名称。
同理:搜索“flowerse”会得到类似“flowers”的建议,而不是更合适的“flowers”建议。
我可以做些什么来改进拼写建议的结果,甚至只是列出永远不会被建议或类似的单词?
为什么当搜索词是我的索引中最常见的词之一时,Solr 会建议这种奇怪的词组合,这些词组合不能出现超过几次?
文本字段类型定义:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(…|[\.]{2,})" replacement=" " />
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
建议字段定义:
<field name="suggestions" type="text" indexed="true" stored="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true" />
请求处理程序:
<requestHandler name="standard" class="solr.SearchHandler" default="true">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="spellcheck.onlyMorePopular">false</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>