11

スペースを含む類義語の処理方法がわかりません! 私は次の設定を持っています:

SOLR 構成ファイル

<fieldType ... >
  <analyzer type="index">
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" 
                            catenateWords="1" 
                            preserveOriginal="1"
                            splitOnCaseChange="1"
                            generateWordParts="1" 
                            generateNumberParts="1"         
                            catenateNumbers="1" 
                            catenateAll="1" 
                            />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
  </analyzer>
  <analyzer type="query">    
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LengthFilterFactory" min="2" max="70" />
    <filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
</fieldType>

私のファイル: syn.txt

st., st => saint
istambul => istanbul
airport, apt => aéroport
NYC => New York
pt., pt => port
brussels => bruxelles

シノニムを除いて、すべてが正常に機能していました:

"NYC => New York"

いくつかの調査を行ったところ、次のことがわかりました。

SynonymFilter は、複数の単語を含む類義語 (つまり、「シー ビスケット、シー ビスケット、シービスケット」) で問題なく動作することに注意してください。

このようなシノニムを処理するための推奨されるアプローチは、インデックス作成時にシノニムを拡張することです。これは、クエリ時に次の 2 つの潜在的な問題が発生する可能性があるためです。

Lucene QueryParser は、Analyzer にテキストを渡す前に空白をトークン化するため、ユーザーが sea biscit という単語を検索すると、Analyzer には「sea」と「biscit」という単語が別々に与えられ、それらが類義語に一致することはわかりません。 .

フレーズ検索 (例: "sea biscit") により、QueryParser は文字列全体をアナライザーに渡しますが、SynonymFilter がシノニムを展開するように構成されている場合、QueryParser がトークンの結果リストをアナライザーから取得すると、望ましい効果を持たない MultiPhraseQuery を構築します。

これは、アナライザーが 2 つの用語が同じ位置を占めていることを示すために使用できるメカニズムが限られているためです。「句」が用語と同じ位置を占めていることを示す方法はありません。

この例では、結果の MultiPhraseQuery は "(sea | sea | seabiscuit) (biscuit | biscit)" となり、ドキュメント内で発生する "seabiscuit" の単純なケースとは一致しません。

そのため、構成ファイルを変更し、インデックス作成時にフィルターを追加しようとしましたが、機能していません。

誰かにアイデアはありましたか?

4

4 に答える 4

8

で明示的なマッピングを行ってい=>ます。

Solrのドキュメントによると

明示的なマッピングは、「=>」の LHS の任意のトークン シーケンスに一致し、RHS のすべての代替に置き換えます。これらのタイプのマッピングは、スキーマの展開パラメーターを無視します。

したがって、インデックス時NYCに置き換えられたため、検索しても何も返されないと推測しています。New York

代わりに、同等の同義語として宣言してみてください。つまり、の NYC, New York代わりに好きですNYC => New York

次に、どちらを検索しても結果は同じになると思います。

于 2012-09-01T18:55:01.667 に答える