【问题标题】:How to make Solr spellchecker to correct both Latin and Cyrillic words?如何使 Solr 拼写检查器更正拉丁文和西里尔文单词?
【发布时间】:2013-12-03 12:04:55
【问题描述】:

我允许用户用拉丁字母输入俄语单词。如果用户在拉丁字母中拼错了俄语单词,我希望 Solr 拼写检查器以西里尔字母建议正确的单词(索引中的俄语单词是西里尔字母)。但是,如果用户拼错的不是俄语单词(例如品牌名称),则应该用拉丁字母进行更正(索引中的不是俄语单词是拉丁语)。

例如,tilevizor smasung 应固定为 телевизор samsung

现在我正在使用以下配置:

<fieldType name="spell_ru" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ICUTransformFilterFactory" id="Any-Cyrillic; NFD; [^\p{Alnum}] Remove" />
    </analyzer>
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.LengthFilterFactory" min="3" max="256" />
    </analyzer>
</fieldType>

它将查询转换为西里尔字母,因此俄语单词更正有效。但拉丁语没有。 (tilevizorтелевизор 有效,但 smasungsamsung 无效)。

有什么想法,我怎样才能让拼写检查器同时纠正西里尔文和拉丁语单词?

【问题讨论】:

  • 您的实际拼写检查配置是什么。以上只是字段定义。

标签: solr


【解决方案1】:

我认为,可以提供帮助的解决方案是 Beider-Morse 语音匹配 (BMPM)

Beider-Morse 语音匹配 (BMPM) 是一种“声音相似”工具,可让 您使用新的语音匹配系统进行搜索。

因此,例如单词 'tilevizor' 和 'телевизор' 听起来很像,我们将得到匹配。可以调整的是语音匹配算法。 Solr 是supporting 其中很多,我不确定哪一个会表现更好:DoubleMetaphone、Metaphone、Soundex、RefinedSoundex、Caverphone (v2.0)、ColognePhonetic 或 Nysiis。

另外,我想用id="Russian-Latin/BGN" 更新solr.ICUTransformFilterFactory,这样可以更好地将俄罗斯符号转换为拉丁符号。

    <fieldType name="spell_ru" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ICUTransformFilterFactory" id="Russian-Latin/BGN"/>
            <filter class="solr.PhoneticFilterFactory" encoder="Caverphone"/>
        </analyzer>
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ICUTransformFilterFactory" id="Russian-Latin/BGN"/>
            <filter class="solr.PhoneticFilterFactory" encoder="Caverphone"/>
        </analyzer>
    </fieldType>

上面的 fieldType 在很多情况下都可以解决问题,例如

q=title:tilevizor
SolrDocument{title=телевизор samsung, _version_=1583123812650582016}
SolrDocument{title=televizor самсунг, _version_=1583123812667359232}

q=title:тилевизор
SolrDocument{title=телевизор samsung, _version_=1583123812650582016}
SolrDocument{title=televizor самсунг, _version_=1583123812667359232}

q=title:smasung
SolrDocument{title=телевизор samsung, _version_=1583123812650582016}
SolrDocument{title=televizor самсунг, _version_=1583123812667359232}
SolrDocument{title=гэлакси samsung, _version_=1583123812684136448}
SolrDocument{title=galaxy самсунг, _version_=1583123812684136449}

我已经创建了以下测试类here,请随意使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多