2

UAX29URLEmailTokenizerFactory トークナイザーを使用して、SOLR でいくつかの URI のインデックスを作成しています。問題は、一部の URI にプラス文字が含まれていることです。これは、SOLR が空白として解釈し、URI を分割します。この問題は、「+」文字を巧妙にエスケープすることで解決できますか? アナライザーで「+」を試しましたが、同じ結果が得られました。フィールドの正確な構成は次のとおりです。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
4

2 に答える 2

4

アナライザーの前に CharacterFilter (例: PatternReplaceCharFilterFactory) を使用できます。このリンクには良い情報があります。私が考えることができる 1 つの解決策は、+ 文字を他の文字に置き換えることです。このリンクを提供するときは、元に戻すことを忘れないでください。

もう 1 つ調査する必要があるのは、それをプラス (%2B) の URL エンコード値に置き換えて、アナライザーがそれをスペースとして扱うかどうかを確認することです。

于 2012-06-14T13:27:51.140 に答える
1

私が思いついた解決策は、最終的に上記のようにCharacterFilterを利用します。秘訣は、エンコードされた文字'%2B'で置き換えることでした。これには、URIを単一のトークンとして保持し、適切な状態('+'として)でアプリケーションに返すという効果がありました。これが私が思いついたフィールドタイプの定義です:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
于 2012-06-15T06:51:00.760 に答える