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

Rin*_*nas 7 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>
Run Code Online (Sandbox Code Playgroud)

它将查询转换为西里尔字母,因此俄语单词更正有效.但拉丁语没有.(tilevizor?????????作品,但smasungsamsung不).

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

Mys*_*ion 1

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

\n\n
\n

贝德莫尔斯语音匹配 (BMPM) 是一种“听起来相似”的工具,\n 您可以使用新的语音匹配系统进行搜索。

\n
\n\n

因此,例如单词 \'tilevizor\' 和 \'\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x80\ ' 听起来像这样,我们就会得到一个匹配。可以调整的是语音匹配算法。Solr正在支持其中很多,但我不确定哪一个性能更好:DoubleMetaphone、Metaphone、Soundex、RefinedSoundex、Caverphone (v2.0)、ColognePhonetic 或 Nysiis。

\n\n

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

\n\n
    <fieldType name="spell_ru" class="solr.TextField" positionIncrementGap="100" omitNorms="true">\n        <analyzer type="query">\n            <tokenizer class="solr.StandardTokenizerFactory"/>\n            <filter class="solr.LowerCaseFilterFactory"/>\n            <filter class="solr.ICUTransformFilterFactory" id="Russian-Latin/BGN"/>\n            <filter class="solr.PhoneticFilterFactory" encoder="Caverphone"/>\n        </analyzer>\n        <analyzer type="index">\n            <tokenizer class="solr.StandardTokenizerFactory"/>\n            <filter class="solr.LowerCaseFilterFactory"/>\n            <filter class="solr.ICUTransformFilterFactory" id="Russian-Latin/BGN"/>\n            <filter class="solr.PhoneticFilterFactory" encoder="Caverphone"/>\n        </analyzer>\n    </fieldType>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
q=title:tilevizor\nSolrDocument{title=\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x80 samsung, _version_=1583123812650582016}\nSolrDocument{title=televizor \xd1\x81\xd0\xb0\xd0\xbc\xd1\x81\xd1\x83\xd0\xbd\xd0\xb3, _version_=1583123812667359232}\n\nq=title:\xd1\x82\xd0\xb8\xd0\xbb\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x80\nSolrDocument{title=\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x80 samsung, _version_=1583123812650582016}\nSolrDocument{title=televizor \xd1\x81\xd0\xb0\xd0\xbc\xd1\x81\xd1\x83\xd0\xbd\xd0\xb3, _version_=1583123812667359232}\n\nq=title:smasung\nSolrDocument{title=\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x80 samsung, _version_=1583123812650582016}\nSolrDocument{title=televizor \xd1\x81\xd0\xb0\xd0\xbc\xd1\x81\xd1\x83\xd0\xbd\xd0\xb3, _version_=1583123812667359232}\nSolrDocument{title=\xd0\xb3\xd1\x8d\xd0\xbb\xd0\xb0\xd0\xba\xd1\x81\xd0\xb8 samsung, _version_=1583123812684136448}\nSolrDocument{title=galaxy \xd1\x81\xd0\xb0\xd0\xbc\xd1\x81\xd1\x83\xd0\xbd\xd0\xb3, _version_=1583123812684136449}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这里创建了以下测试类,请随意使用这个测试类。

\n