2017-06-06 4 views
0

Ich habe Probleme mit zwei ähnlichen Anwendungsfällen.Solr-Index für verkettete Wörter suchen

Hier ist ein Beispiel-Dokument aus meinem Index:

{ 
     "id":"E850AC8D844010AFA76203B390DD3135", 
     "brand_txt_en":"Tom Ford", 
     "catch_all":["Tom Ford", 
      "FT 5163", 
      "Tom Ford", 
      "FT 5163", 
      "DARK HAVANA"], 
     "model_txt_en":"FT 5163", 
     "brand_txt_en_split":"Tom Ford", 
     "model_txt_en_split":"FT 5163", 
     "color_txt_en":"DARK HAVANA", 
     "material_s":"acetato", 
     "gender_s":"uomo", 
     "shape_s":"Wayfarer", 
     "lens_s":"cerchiata", 
     "modelkey_s":"86_1_FT 5163", 
     "sales_i":0, 
     "brand_s":"Tom Ford", 
     "model_s":"FT 5163", 
     "color_s":"DARK HAVANA", 
     "_version_":1569456572504997895 
} 

Abfrage: brand_txt_en_split: tomford

Keine Ergebnisse!

Feldtyp ist standardmäßig die Solr ein:

<fieldType name="text_en_splitting" class="solr.TextField" autoGeneratePhraseQueries="true" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/> 
     <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    </fieldType> 

Ich erwarte WordDelimiterFilterFactory „tomford“ Token durch Verketten Wörter zu erzeugen, aber es sieht aus wie das ist nicht wie erwartet funktioniert.

Die 'inverse' Anwendungsfall ist:

{ 
    ... "model_txt_en_split": "The Clubmaster", ... 
} 

Ich möchte, daß das Dokument nach dieser Abfrage gefunden werden: Club Master

Ich glaube, ich EdgeNGram Filter für den letzteren Fall verwendet werden soll , aber wirklich nicht, wie man das macht.

Danke für Ihre Hilfe

Antwort

1

Die WordDelimiterFilterFactory hat die catenateWords und catenateAll. Es funktioniert, wo Sie haben:

catenateWords: (integer, default 0) If non-zero, maximal runs of word parts will be joined: "hot-spot-sensor's" -> "hotspotsensor" 

catenateAll: (0/1, default 0) If non-zero, runs of word and number parts will be joined: "Zap-Master-9000" -> "ZapMaster9000"` 

Um den Raum zwischen den Wörtern entfernen Sie bitte die folgenden Filter versuchen.

<filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" /> 

Sobald Sie die schema.xml hinzufügen/aktualisieren. Starten Sie den Server neu und indizieren Sie die Daten neu.

Sie können den folgenden fieldType für Ihren Feldnamen versuchen.

<analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="25"/> 
</analyzer> 

Eingang String: "John Oliver W Clane"

Tokenizer auf Filter: "John Oliver W Clane"

Ausgabe Tokens:

"John", "John ", "John O", "John Ol", "John Oli", "John Oli", "John Oliv", "John Olive", "John Oliver", "John Oliver ", "John Oliver W", "John Oliver W " 
, "John Oliver W C", "John Oliver W Cl", "John Oliver W Cla", "John Oliver W Clan", "John Oliver W Clane". 

Es gibt einen weiteren Filter Sie das gleiche versuchen.

<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="25"/> 

Sie können mehr über die Analysatoren und Filter lesen Solr Analyzers and Filters

+0

Danke. Leider ist das keine Antwort auf meine Frage. Ich meine: Wie kann ich ein Token, das durch Verkettung aller anderen Token erstellt wurde, genau hinzufügen? In Ihrem Beispiel: "hot spot sensor s" -> "hotspotsensor" –

+0

Ich habe die Antwort aktualisiert. Versuchen Sie es mit der PatternReplaceFilterFactory. Sobald Sie die schema.xml hinzufügen/aktualisieren. Starten Sie den Server neu und indizieren Sie die Daten neu. –

+1

Ich habe wieder update bitte überprüfen Sie, ob es Ihnen hilft. –

Verwandte Themen