2013-10-31 137 views
7

我正在使用solr拼写检查俄语。当你用西里尔文字符输入时,一切都可以,但是当你用拉丁字符输入时,它不起作用。Solr俄语拼写检查

我想要的拼写检查正确,当你与西里尔字符输入,且当你拉丁字符打字。与对应文字与西里尔文字符。

For example, when you type: 

телевидениеее or televidenieee 

It should correct to: 

телевидение 

schema.xml中:

<fieldType name="spell_text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[,.;:]" replacement=" "/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PatternReplaceFilterFactory" pattern="'s" replacement=""/> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true"/> 
     <filter class="solr.LengthFilterFactory" min="3" max="256" /> 
    </analyzer> 
</fieldType> 

solrconfig.xml中

<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> 
    <lst name="spellchecker"> 
     <str name="name">default</str> 
     <str name="field">spellcheck</str> 
     <str name="classname">solr.IndexBasedSpellChecker</str> 
     <str name="buildOnCommit">true</str> 
     <str name="buildOnOptimize">true</str> 
     <str name="spellcheckIndexDir">./spellchecker</str> 
     <str name="accuracy">0.75</str> 
    </lst> 
    <lst name="spellchecker"> 
     <str name="name">wordbreak</str> 
     <str name="field">spellcheck</str> 
     <str name="classname">solr.WordBreakSolrSpellChecker</str> 
     <str name="combineWords">false</str> 
     <str name="breakWords">true</str> 
     <int name="maxChanges">1</int> 
    </lst> 
</searchComponent> 

感谢您的帮助

+0

只是为了澄清 - 你想有'televidenieee'音译为'телевидениеее'然后拼写检查固定'телевидение ',对吗? – rchukh

+0

是的,你说得对。 – KiraLT

+0

你还可以分享你使用的'requestHandler'吗? – cheffe

回答

5

它可以与ICUTransformFilterFactory,这将(未)每次音译所述输入查询被achived。

下面是一个如何可以实现这个功能的示例,:

  1. 启用ICU4J amalyzers(lucene的-分析器-ICU - *罐子,ICU4J - *罐子。):

    这些库可在contrib/analysis-extras从官方网站(他们也可通过maven获得)分发。

    solrconfig.xml中添加像这些东西,让他们(可以有一个lib目录与您需要的所有jar文件,在这个例子中,它只是使用相对默认位置从官方发行example/solr/collection1/conf文件夹):

    <lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" /> 
    <lib dir="../../../contrib/analysis-extras/lucene-libs" regex=".*\.jar" /> 
    
  2. 拆分spell_text现场分析仪分为两个单独的列表进行索引和查询。

  3. Add solr。ICUTransformFilterFactory如查询分析器具有以下ID Any-Cyrillic; NFD; [^\p{Alnum}] Remove

    <fieldType name="spell_text" class="solr.TextField" positionIncrementGap="100"> 
        <analyzer type="index"> 
        <charFilter class="solr.HTMLStripCharFilterFactory"/> 
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[,.;:]" replacement=" "/> 
        <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.PatternReplaceFilterFactory" pattern="'s" replacement=""/> 
        <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true"/> 
        <filter class="solr.LengthFilterFactory" min="3" max="256" /> 
        </analyzer> 
        <analyzer type="query"> 
        <charFilter class="solr.HTMLStripCharFilterFactory"/> 
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[,.;:]" replacement=" "/> 
        <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.PatternReplaceFilterFactory" pattern="'s" replacement=""/> 
        <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true"/> 
        <filter class="solr.LengthFilterFactory" min="3" max="256" /> 
    
        <filter class="solr.ICUTransformFilterFactory" id="Any-Cyrillic; NFD; [^\p{Alnum}] Remove" /> 
        </analyzer> 
    </fieldType> 
    

关于ICUTransformFilterFactory ID - Any-Cyrillic; NFD; [^\p{Alnum}] Remove

上述配置工作我的本地机器上以同样的方式对俄语音译和俄语单词

+0

当然,这意味着您将无法在该字段中使用拉丁字符进行搜索(因为它会被转换为西里尔文字符)。如果您需要*拉丁文和西里尔文字符进行搜索,则可以使用copyField进行单独的西里尔字母和拉丁字母拼写检查。 – rchukh

+0

我需要通过拉丁字母和西里尔字符进行搜索。例如查询“tilevizor smasung”被固定为“телевизорsamsung”。我可以创建两个字段(一个用于拉丁文,另一个用于西里尔字母)。但我如何将它们用于拼写检查? – KiraLT

+0

嗯......当我在前面的评论中谈到拉丁文和西里尔文的字符时,我的意思是说它们将被分开 - 拉丁文或西里尔文。 你在这里提出的要求要复杂得多。如果在用于拼写检查的字段中同时包含“samsung”和“самсунг”,你怎么能说“smasung”应该更正为“三星”而不是“самсунг”? – rchukh