8

私は solr で複数単語の同義語を実装しようとしています。具体的には、

msc divina => divina

したがって、ユーザーが「msc divina」と入力すると、solr は「divina」のみの結果を返す必要があります。

schema.xml の定義は次のようになります。

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100" 
    autoGeneratePhraseQueries="true">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.SynonymFilterFactory"
            synonyms="synonyms_de.txt"
            ignoreCase="true"
            expand="false" />
        <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords_de.txt"
            enablePositionIncrements="true" />
        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="0"
            splitOnCaseChange="1" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.KeywordMarkerFilterFactory" 
            protected="protwords_de.txt" />
        <filter class="solr.SnowballPorterFilterFactory" language="German2" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords_de.txt"
            enablePositionIncrements="true" />
        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="0"
            catenateNumbers="0"
            catenateAll="0"
            splitOnCaseChange="1" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.KeywordMarkerFilterFactory" 
            protected="protwords_de.txt" />
        <filter class="solr.SnowballPorterFilterFactory" language="German2" />
    </analyzer>
</fieldType>

うまくいきません。クエリ アナライザーに類義語フィルターを追加すると、"msc divina" で検索すると、"msc および "divina" のすべてのヒットが返されます。

どうすればこれを解決できますか?

4

3 に答える 3

1

Solrのドキュメントから:

SynonymFilter は複数の単語を含む同義語 (つまり、「シー ビスケット、シー ビスケット、シービスケット」) で問題なく機能しますが、このような同義語を処理するための推奨されるアプローチは、インデックス作成時に同義語を拡張することです。これは、クエリ時に発生する可能性がある 2 つの潜在的な問題があるためです。

Lucene QueryParser は、Analyzer にテキストを渡す前に空白をトークン化します。そのため、ユーザーが sea biscit という単語を検索すると、Analyzer には「sea」と「biscit」という単語が別々に与えられ、それらが類義語に一致することはわかりません。 . フレーズ検索 (例: "sea biscit") により、QueryParser は文字列全体をアナライザーに渡しますが、SynonymFilter がシノニムを展開するように構成されている場合、QueryParser がトークンの結果リストをアナライザーから取得すると、は、望ましい効果をもたらさない MultiPhraseQuery を構築します。これは、アナライザーが 2 つの用語が同じ位置を占めていることを示すために使用できるメカニズムが限られているためです。「句」が用語と同じ位置を占めていることを示す方法はありません。

ここで、彼らは 1 つの問題を説明しています: を使用しない限りsea biscit、 indexed を検索して一致を取得することはできませんが、複数の単語のクエリでクエリ時に何が起こるかについても説明しています。seabiscuitexpand=true

msc divina -> msc | divina - phrase query

msc ドキュメントと divina ドキュメントの両方に一致します。クエリ時に検索することを指定できれば、"msc divina"それが機能します。

それ以外の場合は、クエリ時に複数単語対応のトークナイザーが必要になるか、FieldQParserプラグインを拡張してこれを行うことができます。詳細については、こちらをご覧ください

于 2013-11-12T15:01:33.157 に答える