2016-05-10 11 views
2

Ich habe den Namen Audioslave indiziert auf Solr und ich möchte dieses Dokument mit der Abfragezeichenfolge Audio Slave übereinstimmen.So ignorieren Sie Leerzeichen auf Solr-Abfrage

Ich habe folgende Regel konfiguriert:

<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> 

Und ein Feld, um es mit:

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

Wenn Solr Analyse-Tool alles sieht gut aus.

Der Teil Abfrage ist die folgende:

  • Die KeywordTokenizerFactory Audio Slave erzeugt,
  • Dann wird die WordDelimiterFilterFactory es spaltet sich in Audio Slave, Audio, AudioSlave und Slave (lässt nur die 3. Spalte verwenden (AudioSlave) von hier
  • Die TrimFilterFactory behält sie als AudioSlave
  • Schließlich der LowerC aseFilterFactory es audioslave

Auf der anderen Seite zu ändern, wird der Indexteil ist:

  • Die KeywordTokenizerFactory Audioslave erzeugt,
  • Dann wird die WordDelimiterFilterFactory und TrimFilterFactory hält es als Audioslave
  • Schließlich wird die LowerCaseFilterFactory ändern Sie es in audioslave

So sollten beide Felder übereinstimmen, aber die Abfrage gibt keine Ergebnisse:

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

Antwort

1

Ihr Problem nicht Analyse ist, dann ist es QueryParser Syntax. Leerzeichen werden verwendet, um Abfrageklauseln zu trennen. Dies wird vom Analyseprogramm nicht beeinflusst. Wenn Sie q=Audio slave haben, wendet es zuerst Syntaxregeln für Abfragen an, trennt sie in die Klauseln "Audio" und "Slave" und analysiert dann jede Klausel einzeln.

den Raum Escaping sollte die Arbeit machen, glaube ich: q=Audio\ slave

Eine Phrase Abfrage hier scheint, wie es funktionieren soll, wie q="Audio slave", aber es funktioniert nicht. Es erzeugt etwas wie: "(audio slave audio audioslave) slave" für mich, was problematisch ist.

+0

Ja, entkommt der Raum funktioniert. – dcarneiro

0

Versuchen Sie es mit dem WhitespaceTokenizerFactory als Tokenizer für Ihren Indexteil. Hier behält der KeywordTokenizerFactory den Text so wie er ist ... er wird keine Token erzeugen.

Ersetzen Sie dasselbe mit WhitespaceTokenizerFactory. WhitespaceTokenizerFactory wird Token im Raum erstellen.

+1

Ihre Analyse verwendet 'WordDelimiterFilter', um separate Token anstelle des Tokenizers zu erstellen. – femtoRgon

Verwandte Themen