8

solr で特殊文字を使用した検索に問題があります。私のドキュメントには「タイトル」フィールドがあり、「タイタニック - 1999」のようになることがあります (文字「-」が含まれます)。「-」を使用してsolrで検索しようとすると、400エラーが発生します。文字をエスケープしようとしたので、「-」と「\-」のようなものを試しました。その変更により、solr はエラーで応答しませんが、0 の結果を返します。

その特殊文字(「-」や「'」など)を使用してsolr管理者を検索するにはどうすればよいですか???

よろしく

更新 ここで私の現在のsolrスキームを見ることができますhttps://gist.github.com/cpalomaresbazuca/6269375

私の検索は、フィールド「タイトル」です。

schema.xml からの抜粋:

 ...
 <!-- A general text field that has reasonable, generic
     cross-language defaults: it tokenizes with StandardTokenizer,
     removes stop words from case-insensitive "stopwords.txt"
     (empty by default), and down cases.  At query time only, it
     also applies synonyms. -->
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <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">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <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>
...
<field name="Title" type="text_general" indexed="true" stored="true"/>
4

3 に答える 3

9

text_generaltitle 属性に標準フィールドを使用しています。これは良い選択ではないかもしれません。text_generalは、テキスト (または少なくとも文) の巨大なチャンク用であり、名前やタイトルの正確な一致用ではありません。

ここでの問題は、 StandardTokenizerFactorytext_generalを使用することです。

 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <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">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <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>

StandardTokenizerFactory次のことを行います。

多くの余分な文字を削除し、トークンの種類を意味のある値に設定する優れた汎用トークナイザー。トークンの種類は、同じトークンの種類を認識している後続のトークン フィルターにのみ役立ちます。

これは、「-」文字が完全に無視され、文字列をトークン化するために使用されることを意味します。

「kong-fu」は「kong」と「fu」で表します。「-」が消えます。

これは、ここで機能しない理由も説明していselect?q=title:\-ます。

より適切なフィールド タイプを選択します。

の代わりに、単語を完全に一致させるために空白でのみ分割する , をStandardTokenizerFactory使用できます。solr.WhitespaceTokenizerFactoryしたがって、タイトル属性に独自のフィールド タイプを作成することが解決策になります。

Solrには、と呼ばれるフィールドタイプもありtext_wsます。要件によっては、これで十分な場合があります。

于 2015-03-02T18:20:02.380 に答える
1

正確なフレーズを検索するには、そのフレーズを逆コンマで囲みます:

select?q=title:"Titanic - 1999" 

その特殊文字を検索したいだけの場合は、エスケープする必要があります。

select?q=title:\-

またチェックしてください: 特殊文字(-&+など)がSOLRクエリで機能しない

使用したくない特殊文字が正確にわかっている場合は、これを regex-normalize.xml に追加できます。

<regex> 
  <pattern>&#x2D;</pattern> 
  <substitution>%2D</substitution> 
</regex>

これにより、すべての「-」が %2D に置き換えられるため、検索時に「-」の代わりに %2D を検索する限り、正常に機能します。

于 2013-08-19T14:23:09.203 に答える
1

私はこれを成し遂げるのに多くの時間を費やしました。ここでは、SolR で特殊文字をクエリするために実行する手順を明確に示します。それが誰かを助けることを願っています。

  1. schema.xml ファイルを編集して、使用している solr.TextField を見つけます。
  2. 「インデックス」および「クエリ」アナライザーの両方で、 次のようなものを変更しWordDelimiterFilterFactoryて追加します。types="characters.txt"

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
     <analyzer type="index">
     <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
    </analyzer>
    <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
    </analyzer>
    </fieldType>
    
  3. 上記のように、必ず WhitespaceTokenizerFactory をトークナイザーとして使用してください。

  4. characters.txt ファイルには、次のようなエントリを含めることができます-

     \# => ALPHA
    @ => ALPHA
    \u0023 => ALPHA
                    ie:- pointing to ALPHA only.
    
  5. データをクリアし、再インデックスして、入力した文字をクエリします。それが動作します。

于 2016-07-27T07:51:45.357 に答える