Ho un'istanza Solr con un componente suggeritore. Funziona bene, usando l'implementazione AnalyzingInfixLookupFactory
.Costruisci suggerimenti Solr basati su frasi anziché sull'intero valore di campo
Tuttavia, desidero espandere i suggerimenti in un campo content
, che può contenere molto testo. Il suggeritore trova tutti i suggerimenti, ma restituisce l'intero valore di campo, anziché solo una frase o parte di una frase.
Quindi, se voglio un suggerimento per "pippo", e il campo content
contiene un testo come:..
"Mi piace molto la pizza e ciambelle Prendiamo alcuni da quell'altro posto The. foo bar place. "
Il suggerimento sarà che intero testo, invece di "Il posto foo bar". E, ovviamente, quando content
sono centinaia di parole lunghe, questo non è proprio usabe.
C'è un modo per limitare il numero di parole restituite per un suggerimento?
Ecco la mia componente di ricerca:
<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>
Ed ecco il gestore della richiesta:
<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>
Infine, ecco il campo da cui sono derivati i suggerimenti:
<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 quindi utilizzare un gruppo di <copyField>
s per copiare il contenuto.
EDIT 2015-08-28
La definizione content
campo è la seguente:
<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
Questo problema è probabilmente correlato: Is Solr SuggestComponent able to return shingles instead of whole field values?
che modo il tipo di campo di contenuti assomiglia? –
Domanda aggiornata di conseguenza. – wadmiraal
puoi aggiungere anche alcuni dati di esempio? – YoungHobbit