如何使Solr拼写检查器纠正拉丁语和西里尔语单词?

时间:2013-12-03 12:04:56

标签: solr

我允许用户用拉丁字母键入俄语单词。如果用户用拉丁字母拼错俄语单词,我希望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没有。

任何想法,我如何使用拼写检查来纠正西里尔字母和拉丁字样?

1 个答案:

答案 0 :(得分:1)

我认为,这个解决方案可以帮助Beider-Morse Phonetic Matching(BMPM)

  

Beider-Morse Phonetic Matching(BMPM)是一款“声音相似”的工具   你使用一个新的语音匹配系统进行搜索。

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

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

    <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,请随意使用此测试类。