2013-10-31 16 views
7

Ich verwende Solr Rechtschreibprüfung für die russische Sprache. Wenn Sie mit kyrillischen Buchstaben tippen, ist alles in Ordnung, aber es funktioniert nicht, wenn Sie mit lateinischen Buchstaben tippen.Solr russische Rechtschreibprüfung

Ich möchte, dass die Rechtschreibprüfung richtige und wenn Sie die Eingabe mit Zeichen Kyrillisch und wann bist du mit Latin Zeichen eingeben. Und entspricht Text mit Kyrillisch Zeichen.

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> 

Vielen Dank für Hilfe

+0

Nur um zu klären - Sie 'televidenieee' transkribiert zu' телевидениеее' und dann fixierte durch Rechtschreibprüfung 'телевидение haben wollen ', oder? – rchukh

+0

ja, hast du recht. – KiraLT

+0

Können Sie auch den 'requestHandler' teilen, den Sie verwenden? – cheffe

Antwort

5

Es kann mit ICUTransformFilterFactory, achived werden, die die Eingabe Abfrage jedes Mal wird (un) transkribieren. Hier

ist ein Beispiel, wie man diese Funktionalität aktivieren können:

  1. aktivieren icu4j amalyzers (lucene-Analysatoren-ICU - * jar, icu4j - * Glas..):

    Diese Bibliotheken finden Sie in contrib/analysis-extras Ordner der Solr-Distribution von der offiziellen Website (sie auch über Maven verfügbar).

    In solrconfig.xml etwas wie diese hinzufügen, damit sie (es kann ein einzelner lib dir sein mit all den Gläsern, die Sie benötigen, in diesem Beispiel verwendet es nur Standardposition relativ zu example/solr/collection1/conf Ordner aus offiziellen Distribution):

    <lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" /> 
    <lib dir="../../../contrib/analysis-extras/lucene-libs" regex=".*\.jar" /> 
    
  2. Teilen Spell_text Feldanalysatoren in zwei separate Liste für Index und Abfrage.

  3. Hinzufügen solr.ICUTransformFilterFactory als Query Analyzer mit der folgenden 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> 
    

In Bezug auf die ICUTransformFilterFactory id - Any-Cyrillic; NFD; [^\p{Alnum}] Remove:

Die oben beschriebene Konfiguration ist auf meinem lokalen Rechner arbeiten, um die gleiche Art und Weise für russisch Transkriptionen und russische Worte

+0

Das bedeutet natürlich, dass Sie nicht nach lateinischen Zeichen in diesem Feld suchen können (weil es in kyrillische Zeichen umgewandelt wird). Wenn Sie nach * sowohl * lateinischen als auch kyrillischen Zeichen suchen müssen, können Sie copyField (s) für die getrennte kyrillische und lateinische Rechtschreibprüfung verwenden. – rchukh

+0

Ich muss nach lateinischen und kyrillischen Zeichen suchen. Zum Beispiel Abfrage "tilevizor smasung" zu "телевизор samsung" behoben werden. Ich kann zwei Felder erstellen (eines für Latein, eines für kyrillische Buchstaben). Aber wie kann ich beide zur Rechtschreibprüfung benutzen? – KiraLT

+0

Nun ... als ich über die lateinischen und kyrillischen Zeichen im vorherigen Kommentar sagte, meinte ich, dass sie getrennt werden - entweder lateinisch oder kyrillisch. Was Sie hier fragen, ist viel komplizierter .. z. wie können Sie sagen, dass "smasung" sollte zu "samsung" und nicht "самсунг" korrigiert werden, wenn es "samsung" und "самсунг" in dem Feld gibt, das für Rechtschreibprüfung verwendet wird? – rchukh