1

我试图找到一种方法来改进 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>
4

1 回答 1

1

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

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

另请注意,EnglishPorterFilterFactory 已被弃用,建议您改用SnowballPorterFilterFactory

于 2013-02-20T20:45:28.227 回答