7

ロシア語に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>

手伝ってくれてありがとう

4

1 に答える 1

5

これはICUTransformFilterFactoryで実現できます。これは、入力クエリを毎回音訳します。

この機能を有効にする方法の例を次に示します。

  1. icu4j アマライザーを有効にします(lucene-analyzers-icu-*.jar、icu4j-*.jar):

    これらのライブラリはcontrib/analysis-extras、公式サイトの solr ディストリビューションのフォルダーにあります (maven からも入手できます)。

    solrconfig.xml で、これらを有効にするために次のようなものを追加します (必要なすべての jar を含む単一の lib ディレクトリが存在する可能性があります。この例ではexample/solr/collection1/conf、公式ディストリビューションのフォルダーに相対的なデフォルトの場所を使用しています)。

    <lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" />
    <lib dir="../../../contrib/analysis-extras/lucene-libs" regex=".*\.jar" />
    
  2. spell_textフィールド アナライザーを、インデックス用とクエリ用の 2 つの個別のリストに分割します。

  3. 次の id を持つクエリ アナライザーとしてsolr.ICUTransformFilterFactoryを追加します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:

上記の構成は、ロシア語の音訳とロシア語の単語に対して同じように私のローカル マシンで動作しています。

于 2013-11-05T22:51:09.283 に答える