我正在努力寻找一种方法来改进Solr提供的拼写建议,同时尽可能保留尽可能多的好建议。一个特别的搜索让我头疼不已:
“黄花”
搜索此Solr时,会提供“黄色花朵”的建议
据我所知,这是来自该领域的一个部分,用于生成看起来像“花。它”的建议。
这只是我在这个特定查询中遇到的许多问题之一(我确信他们有很多其他问题,但我正专注于解决这个问题)。以前我遇到过省略连接单词的问题,例如:
“花...... a”=> “黄色的花朵”
我已经厌倦了各种各样的事情,比如在查询中添加spellcheck.accuracy,但我在排除无效之前发现这被排除了有效的建议(它排除了“ace”=>“acer”在0.7,但没有排除“flowerse”直到0.9)。我只尝试过MorePore是真假两种,都没有明显的效果。
我正在考虑尝试使用thresholdTokenFrequency,但我有一种感觉,我会失去很多有效的建议,比如可能只出现在索引中的专有名称。
沿着同样的路线:搜索“flowerse”会产生像“flowersse”这样的建议,而不是更合适的“鲜花”建议。
我可以做些什么来改善拼写建议的结果,甚至只是列出永远不会被建议或类似的单词?
为什么当搜索词是我索引中最常见的词之一时,Solr建议这种奇怪的单词组合不会出现多次?
text fieldType definition:
<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:
<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>
答案 0 :(得分:1)
感谢您发布fieldType定义。基于此,我认为您的问题与使用EnglishPorterFilterFactory和WordDelimiterFilterFactory有关。这两个过滤器工厂正在更改被标记化的值(由Solr在现场存储)以最大化搜索结果。因此,您可以将这些带有限制和分隔的值作为拼写建议提供,我相信这不是您期望的行为。
在这种情况下,我建议在建议字段中使用不同的fieldType,将这两个过滤器工厂作为起点,以查看您的拼写建议是否得到改进。因为我相信您希望拼写建议更能代表传递给Solr的值以进行索引,而不是Solr如何存储它们以最大化搜索结果。
另请注意EnglishPorterFilterFactory has been deprecated,建议您切换到SnowballPorterFilterFactory。