Solr返回可怜的拼写错误建议

时间:2013-02-20 19:47:19

标签: solr django-haystack

我正在努力寻找一种方法来改进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>

1 个答案:

答案 0 :(得分:1)

感谢您发布fieldType定义。基于此,我认为您的问题与使用EnglishPorterFilterFactory和WordDelimiterFilterFactory有关。这两个过滤器工厂正在更改被标记化的值(由Solr在现场存储)以最大化搜索结果。因此,您可以将这些带有限制和分隔的值作为拼写建议提供,我相信这不是您期望的行为。

在这种情况下,我建议在建议字段中使用不同的fieldType,将这两个过滤器工厂作为起点,以查看您的拼写建议是否得到改进。因为我相信您希望拼写建议更能代表传递给Solr的值以进行索引,而不是Solr如何存储它们以最大化搜索结果。

另请注意EnglishPorterFilterFactory has been deprecated,建议您切换到SnowballPorterFilterFactory