2015-09-03 8 views
12

私はいくつかの非ASCII文字の結果を返さないSolrコレクションを持っています。使用している例は、文字列S11. • “≡ «Ñaïvétý» ‘¢¥£’ ¶!#%です。インデックス付きフィールドにオブジェクトがあるにもかかわらず、その文字列全体を検索すると結果が返されません。ただし、その文字列の部分文字列を検索すると、一致が返されます。一致が返されないのは、• “≡の3つです。フィールドはtext_enとしてインデックスされましたが、私はedge_ngram(問題を解決するためにCargo Cult魔法のビットを期待しています)を試しました。これらの3つの文字について特別なことがありますか、またはSolrがフィールドのインデックスを作成する方法を調整する必要がありますか?特定の文字でSolr検索に失敗する

django-haystackで検索していますが、問題はSolr管理者にも表示されます。ここで

は、2つのフィールドタイプの定義です:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory"   
      generateWordParts="1" generateNumberParts="1" catenateWords="0" 
      catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.EdgeNGramFilterFactory" 
      minGramSize="2" maxGramSize="50" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" generateNumberParts="1" catenateWords="0" 
      catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" 
      ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

の結果をチェックしましたか?空白のように見えるが、そうではない文字がいくつかある。 1つの例は「[非分割スペース](https://en.wikipedia.org/wiki/Non-breaking_space)」です。これらはコピーして貼り付けるときに文字化けすることがあります。 – cheffe

+0

最後の質問:)あなたのスキーマでfieldTypesの 'text_en'と' edge_ngram'はどのように定義されていますか?あなたはそれらを共有しますか?その後、問題を再現しようとする可能性があります。 – cheffe

+0

@cheffe - フィールド定義を追加しました。私は空白文字についても疑問に思っていましたが、私はそれらが単に普通の空白文字であると言うことができます。 Solrは、管理パネルでクエリを見ると、他のスペースと同じように、スペースを「単語」に分割しても問題はありません。 – Tom

答えて

1

は、あなたはこれを試すことができます...

<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="front"/> 
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="back"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

enter image description here

+0

違いはありません。 – Tom

+0

分析ページをご覧ください...これはあなたが期待するものですか? –

+0

私は正直なところ、私が見ていることを知るのに十分ではありません。 'EdgeNGraFilterFactory'の項目は正しく分割されているようで、クエリはマングルされていません。あなたは試合を見ていますか?私はイメージからはわかりません。 – Tom

2

あなたはASCIIFoldingFilterFactory

改宗を使用してみましたアルファベット英字の最初の127文字(「Basic Latin」Unicode ブロック)に存在しない場合は、 の最初の127文字(「Basic Latin」Unicodeブロック)に含まれていない英字、数字、記号のUnicode文字。

<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/> 
+0

それに運がない、ありがとう。 – Tom

1

私はあなたが投稿した両方fieldTypesを試してみましたが、そのSolrの管理ページに付属の解析ページにそれらをチェックしています。どちらもOKと思われる - 下を見てください。グレーの明るい色合いは、一致が生成されたことを示します。

これは私に少し困惑します。そこにはヒットを取得しない理由しかし、いくつかの理由:

  • あなたは、インデックスを再構築なしのschema.xml を変更している、これは動作しますが、生成されますが、あなたがdismaxを使用している
  • に当たっていません/好ましくない値で定義されたMMパラメータを持つedismax queryhandler。あなたはsolrconfig.xml
  • でこれを調べることができます
    • は、しかし、これはあなたのコードからのリクエストを送信する際に、パラメータを変更することができる、単にデフォルト値です。
  • あなたは、インデックス作成時に関与している三つのファイルで興味深いの値、すなわち
    • のlang/stopwords_en.txt
    • protwords.txt
    • 同義語を持っています。text_en enter image description here

      のためのtxt

結果ブランクが本当に空白であれば、あなたはedge_ngram enter image description here

+0

私はそれぞれの変更で再構築しています(少なくとも私はそう望みます)。 conf XMLでは 'dismax'や' edismax'は表示されませんが、これが問題であるかどうかどうしたら確認できますか?最後には、同義語を使用してフィールド定義から単語を取り除くことさえも役に立たないようです。 – Tom

+0

solrconfig.xmlにある ''を調べて、使用しているハンドラを定義してください。最高で、あなたの質問にそれを加えてください。 [Solr Wiki](https://wiki.apache.org/solr/SolrRequestHandler)または[Solrリファレンス](https://cwiki.apache.org/confluence/display/solr/RequestHandlers+and+)をチェックしてください。 SearchComponents + in + SolrConfig)を検索します。 – cheffe

+0

requestHandlerブロックがありません。 – Tom

関連する問題