2016-05-10 11 views
2

私はSolrにAudioslaveという名前のインデックスが付けられており、その文書をクエリ文字列Audio Slaveに一致させたいとします。solrクエリの空白を無視する方法

私は次のようなルール設定されている:

<fieldType name="text_filter" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="1" 
      preserveOriginal="1" 
      generateWordParts="1" 
      generateNumberParts="1"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="1" 
      preserveOriginal="1" 
      generateWordParts="1" 
      generateNumberParts="1"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

そして、それを使用してフィールド:Solrの分析ツールのすべてを使用する場合

<field name="artist_name_filter" type="text_filter" multiValued="false" indexed="true" stored="true" required="false" /> 

がよさそうです。

クエリ部分は以下の通りです:

  • KeywordTokenizerFactoryがAudio Slaveを生成し、
  • その後WordDelimiterFilterFactoryはちょうどここから3列目(AudioSlave)を使用することができます(Audio SlaveAudioAudioSlaveSlaveに分割し
  • TrimFilterFactoryは、それをAudioSlave
  • として保持します。最後に、LowerC aseFilterFactory一方audioslave

に変更し、指数部がある:

  • KeywordTokenizerFactoryはAudioslaveを生成し、
  • そしてWordDelimiterFilterFactoryとTrimFilterFactory最後にAudioslave
  • LowerCaseFilterFactoryとしてそれを保持それをaudioslave
に変更してください

だから、両方のフィールドが一致する必要がありますが、クエリは結果を返しません:

http://localhost:8983/solr/search_api/select?defType=edismax&fq=type:Artist&q=Audio%20slave&qf=artist_name_filter&wt=json

答えて

1

あなたの問題は、分析ではありません、それはQueryParser構文です。スペースはクエリー句を区切るために使用され、アナライザーの影響を受けません。 q=Audio slaveがある場合は、最初にクエリ構文規則を適用し、それを「Audio」と「slave」という句に分けて、それぞれの句を個別に分析します。スペースをエスケープ

が仕事を行う必要があり、私は信じている:それは動作するはずのように、ここでq=Audio\ slave

フレーズクエリは、このようなq="Audio slave"として、ようだが、それはしていません。それは私のために"(audio slave audio audioslave) slave"のようなものを生成しますが、問題があります。

+0

うん、逃げ去るのはうまくいく。 – dcarneiro

0

インデックス部分のトークナイザとしてWhitespaceTokenizerFactoryを使用してみてください。 ここではKeywordTokenizerFactoryはそのままの状態でテキストを保持しています。トークンは作成されません。

WhitespaceTokenizerFactoryと交換してください。 WhitespaceTokenizerFactoryはスペースにトークンを作成します。

+1

彼らの分析では、 'WordDelimiterFilter'を使ってTokenizerの代わりに別々のトークンを作成しています。 – femtoRgon

関連する問題