Solr русская проверка орфографии

Я использую solr spellcheck для русского языка. Когда вы печатаете кириллическими символами, все в порядке, но это не работает, когда вы печатаете латинскими символами.

Я хочу, чтобы проверка орфографии правильно и когда вы набираете с кирилица chars и когда вы печатаете с лат chars. И corret to текст кирилица пеструшки.

For example, when you type:

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

It should correct to:

телевидение

схемы.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>

Спасибо за помощь

1 ответов


это может быть достигнуто с ICUTransformFilterFactory, который будет (un)транслитерировать входной запрос каждый раз.

вот пример, как можно включить эту функцию:

  1. включить icu4j amalyzers (lucene-анализаторы-icu -*.jar, icu4j-*.jar):

    эти библиотеки можно найти в contrib/analysis-extras папка распространения solr с официального сайта (они также доступны через maven).

    In solrconfig.xml добавьте что-то вроде этого, чтобы включить их (может быть один lib dir со всеми необходимыми банками, в этом примере он просто использует местоположение по умолчанию относительно 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. добавить solr.ICUTransformFilterFactory as query analyzer со следующим идентификатором 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:

конфигурация, описанная выше, работает на моей локальной машине таким же образом для русских транслитераций и русских слов