2012-09-25 16 views
6

Voglio usare solr per creare un menu a discesa autosuggestione per un campo di ricerca, ma mi sto bloccando quando provo a ottenere suggerimenti per una frase. Quando cerco "dog t", voglio ottenere un set di risultati contenente frasi come "dog treat", "dog trick", "dog tags", ... ma invece ottengo 2 set di risultati, uno per "dog" "(come ad esempio "cani" "osso di cane" "doggy" ...) e un altro per "T"(come "albero" "tempo" ...)get solr risultati autosuggest per la frase

la mia domanda url è:

http://localhost:8985/solr/mycollection/suggest?q=%22dog%20t%22&wt=json 

e il mio gestore di richieste è definito in solrconfig come ...

<searchComponent class="solr.SpellCheckComponent" name="suggest"> 
    <lst name="spellchecker"> 
     <str name="name">suggest</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
     <str name="field">suggest</str> <!-- the indexed field to derive suggestions from --> 
     <float name="threshold">0.0001</float> 
     <str name="buildOnCommit">true</str> 
    </lst> 
<str name="queryAnalyzerFieldType">textSuggest</str> 
    </searchComponent> 

    <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest"> 
    <lst name="defaults"> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">suggest</str> 
     <str name="spellcheck.onlyMorePopular">true</str> 
     <str name="spellcheck.count">10</str> 
    </lst> 
    <arr name="components"> 
     <str>suggest</str> 
    </arr> 
    </requestHandler> 

Il fieldType di "suggerire" è definito in schema come

<fieldType name="textSuggest" class="solr.TextField" positionIncrementGap="100" > 
     <analyzer type="index"> 
<tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" /> 
<filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="0" 
       catenateNumbers="0" 
       catenateAll="0" 
       preserveOriginal="1" splitOnCaseChange="1" 
       /> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
    </fieldType> 

risposta

6

ho trovato 2 soluzioni al mio problema ...

Uno è quello di creare un queryHandler personalizzato che non contempla il parametro q in più parole.

L'altra opzione, che ho scelto, è quello di utilizzare il parametro spellcheck.q invece di q. Stavo usando solr 3.4.0 e usando spellcheck.q mi ha dato un errore di 500. Ho aggiornato solr a 3.6.1 e sembra che funzioni correttamente ora.

2

SOLR fornisce suggesters come FST (suggerimenti dall'inizio del campo), AnalyzingInfix che possiamo sfruttare per generare autosuggestioni frase/parola intelligenti. Leggi questo articolo per saperne di più sull'implementazione http://lucidworks.com/blog/solr-suggester/