1

私は、Solr が提供するスペル候補をできるだけ多く保持しながら、改善する方法を見つけようとしています。ある特定の検索で、私は大きな頭痛の種になりました。

「黄色い花」

この Solr を検索すると、「yellow flowersit」という候補が表示されます。

私が知る限り、これは「花。

これは、この特定のクエリで発生した問題の多くの繰り返しの 1 つにすぎません (他にもたくさんあると思いますが、この問題の解決に集中しています)。以前は、次のような単語を連結する省略記号に問題がありました。

"flowers...a" => "yellow flowersa"

クエリに spellcheck.accuracy を追加するなど、さまざまなことにうんざりしましたが、無効なものを除外する前に、有効な提案が除外されていることがわかりました (0.7 で「ace」 => 「acer」を除外しましたが、「flowerse」は除外しませんでした)。 " 0.9 まで)。true と false の両方に対して onlyMorePopular を試しましたが、どちらも大きな効果はありませんでした。

私はthresholdTokenFrequencyを使用しようと考えていますが、インデックスに一度しか表示されない可能性のある適切な名前などの多くの有効な提案を失うと感じています.

同様に、「flowerse」を検索すると、より適切な「flowers」の候補ではなく、「flowersse」のような候補が表示されます。

スペル候補の結果を改善するにはどうすればよいですか? または、候補に表示されない単語や類似した単語をリストするだけでもよいですか?

検索語がインデックス内で最も一般的な単語の 1 つであるのに、Solr が数回しか表示されない奇妙な単語の組み合わせを提案するのはなぜですか?

テキスト フィールド タイプの定義:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(…|[\.]{2,})" replacement=" " />
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

提案フィールドの定義:

<field name="suggestions" type="text" indexed="true" stored="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true" />

requestHandler:

<requestHandler name="standard" class="solr.SearchHandler" default="true">
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <str name="spellcheck.onlyMorePopular">false</str>
        <str name="spellcheck.extendedResults">false</str>
        <str name="spellcheck.count">1</str>
    </lst>
    <arr name="last-components">
        <str>spellcheck</str>
    </arr>
</requestHandler>
4

1 に答える 1

1

fieldType 定義を投稿していただきありがとうございます。これに基づいて、あなたの問題は EnglishPorterFilterFactory と WordDelimiterFilterFactory の使用に関連していると思います。これら 2 つのフィルター ファクトリは、検索結果を最大化するために、トークン化されている (Solr によってフィールドに格納されている) 値を変更しています。したがって、これらの語幹および区切り値がスペルの候補として提供されていますが、これは期待されている動作ではないと思います。

このシナリオでは、スペル候補が改善されているかどうかを確認するための出発点として、これら 2 つのフィルター ファクトリを削除する候補フィールドに別の fieldType を使用することをお勧めします。検索結果を最大化するために Solr が値を格納する方法ではなく、インデックス作成のために Solr に渡される値をより代表するスペル候補が必要だと思うからです。

また、 EnglishPorterFilterFactory は廃止されていることに注意してください。代わりにSnowballPorterFilterFactoryに切り替えることをお勧めします。

于 2013-02-20T20:45:28.227 に答える