2015-08-14 3 views
9

Ich habe eine Solr-Instanz mit einem Suggester-Komponente. Es funktioniert gut, mit der AnalyzingInfixLookupFactory Implementierung.Build Solr Vorschläge basierend auf den Sätzen anstelle der gesamten Feld Wert

Allerdings möchte ich die Vorschläge zu einem content Feld erweitern, die eine Menge Text enthalten kann. Der Suggester findet Vorschläge in Ordnung, aber es gibt den gesamten Feldwert statt nur einen Satz oder einen Teil eines Satzes zurück.

Also, wenn ich einen Vorschlag für „foo“ wollen und dem content Feld enthält einen Text wie:..

„Ich mag Pizza und Donuts Lassen Sie uns einige von diesem anderen Ort erhalten die. foo bar Ort. "

Der Vorschlag wird sein, dass gesamte Text, statt nur "The foo bar place". Und natürlich, wenn content Hunderte von Wörtern lang ist, ist dies einfach nicht usabe.

Gibt es eine Möglichkeit, die Anzahl der zurückgegebenen Wörter für einen Vorschlag zu begrenzen?

Hier ist meine Suchkomponente:

<searchComponent name="suggest" class="solr.SuggestComponent"> 
    <lst name="suggester"> 
    <str name="name">autocomplete</str> 
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str> 
    <str name="indexPath">suggestions</str> 
    <str name="dictionaryImpl">DocumentDictionaryFactory</str> 
    <str name="field">suggest</str> 
    <str name="suggestAnalyzerFieldType">text_suggest</str> 
    <str name="buildOnStartup">false</str> 
    <bool name="highlight">false</bool> 
    <str name="payloadField">label</str> 
    </lst> 
</searchComponent> 

Und hier ist der Request-Handler:

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy"> 
    <lst name="defaults"> 
    <str name="suggest">true</str> 
    <str name="suggest.dictionary">autocomplete</str> 
    <str name="suggest.count">10</str> 
    </lst> 
    <arr name="components"> 
    <str>suggest</str> 
    </arr> 
</requestHandler> 

Schließlich ist hier das Gebiet, aus dem die Vorschläge ableiten:

<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="suggest" type="text_suggest" indexed="true" multiValued="true" stored="true"/> 

I Verwenden Sie dann eine Reihe von <copyField> s, um den Inhalt zu kopieren.

EDIT 2015-08-28

Die content Felddefinition lautet wie folgt:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="txt/mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="txt/stopwords.txt" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="25"/> 
    </analyzer> 
    <analyzer type="query"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="txt/mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="content" type="text" indexed="true" stored="true" termVectors="true"/> 

EDIT 2016-09-28

Dieses Problem wahrscheinlich verwandt ist: Is Solr SuggestComponent able to return shingles instead of whole field values?

+1

Wie funktioniert das Feld Art von Inhalt aussehen? –

+0

Aktualisierte Frage entsprechend. – wadmiraal

+0

können Sie auch einige Beispieldaten hinzufügen? – YoungHobbit

Antwort

1

Ich denke was yo Sie suchen können ist solr.ShingleFilterFactory, die einfach erlaubt, die Token-Größe basierend auf der Anzahl der Wörter zu begrenzen, anstatt Text Länge wie in solr.NGramFilterFactory Sie versucht haben zu verwenden.
Bitte sehen SOLR Wikiseite für weitere Informationen:
https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory

+0

Danke. Ich werde es mir ansehen. – wadmiraal

+0

Scheint nicht zu funktionieren, leider. Es schlägt immer noch sehr lange Sätze statt nur Sätze vor. – wadmiraal