1

Solr のスペルチェックの提案に奇妙な問題があります。

次のような用語 (製品番号など) を検索します: 08p17a6

この用語を使用して、インデックス内のドキュメントを見つけます。

spellcheck=true を有効にしました。したがって、ドキュメントに加えて、solr は xml 応答でスペルチェックの提案も提供します。

<lst name="spellcheck">
    <lst name="suggestions">
        <lst name="p17a6">
            <int name="numFound">1</int>
            <int name="startOffset">2</int>
            <int name="endOffset">7</int>
            <arr name="suggestion">
                <str>08p17a6</str>
            </arr>
        </lst>
    </lst>
</lst>

Solr は、検索用語の最初から数番目までを取得し、「p17a6」に基づいて候補を表示します。彼が提案のために最初の 2 つの数字を削除した理由がわかりません。

spellcheck.collat​​e を有効にすると、事態はさらに奇妙になります。

<lst name="spellcheck">
    <lst name="suggestions">
        <lst name="p17a6">
            <int name="numFound">1</int>
            <int name="startOffset">2</int>
            <int name="endOffset">7</int>
            <arr name="suggestion">
                <str>08p17a6</str>
            </arr>
        </lst>
        <str name="collation">0808p17a6</str>
    </lst>
</lst>

複数の検索用語の候補を表示するには、スペルチェックを使用する必要があります。しかし、ご覧のとおり、xml の応答では、「0808p17a6」を使用するように提案されています。

誰もこれがどのように起こるか知っていますか?

編集:

スペルチェックに関する私のスキーマ構成は次のとおりです。

<field name="spell" type="textSpell" indexed="true" stored="false" multiValued="true" />
<copyField source="title"    dest="spell" />
<copyField source="subTitle" dest="spell" />
<copyField source="content"  dest="spell" />

copyfield のソース フィールドは次のように構成されます。

<field name="title"       type="text"   indexed="true"  stored="true" termVectors="true" omitNorms="true" />
<field name="subTitle"    type="text"   indexed="true"  stored="true" termVectors="true" omitNorms="true" />
<field name="content"     type="text"   indexed="true"  stored="true" termVectors="true" />

これは、アナライザーの構成です。

        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="0"
            splitOnCaseChange="1"
            preserveOriginal="1"
        />
        <!-- best practice (currently) for synonyms is to add them by
            expansions during index time
        -->
        <filter class="solr.SynonymFilterFactory" synonyms="german/synonyms.txt" ignoreCase="true" expand="true"/>
        <!-- Case insensitive stop word removal.
            add enablePositionIncrements=true in both the index and query
            analyzers to leave a 'gap' for more accurate phrase queries.
        -->
        <filter class="solr.StopFilterFactory" words="german/stopwords.txt" ignoreCase="true" enablePositionIncrements="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="German2" protected="german/protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>

        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="0"
            catenateNumbers="0"
            catenateAll="0"
            splitOnCaseChange="1"
            preserveOriginal="1"
        />
        <filter class="solr.StopFilterFactory" words="german/stopwords.txt" ignoreCase="true" enablePositionIncrements="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="German2" protected="german/protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

<!-- Setup simple analysis for spell checking -->
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>

        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="german/synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" words="german/stopwords.txt" ignoreCase="true"/>
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory" />

        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory" words="german/stopwords.txt" ignoreCase="true"/>
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>
4

0 に答える 0