2013-10-31 183 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