2011-09-21 13 views
6

Sto usando SOLR 3.2. La mia applicazione emette query di ricerca sull'istanza SOLR, per un tipo di campo di testo. Come posso fare in modo che SOLR restituisca risultati come "book", "bookshelf", "bookasd" così via, quando l'utente invia una query come "book". Dovrei aggiungere manualmente i caratteri "*" alla stringa di query o c'è un'impostazione in SOLR quindi farà le ricerche prefisso sul campo per impostazione predefinita?Come configurare SOLR in modo che gli utenti possano effettuare la ricerca prefisso per impostazione predefinita?

Questa è la sezione schema.xml per il tipo di campo di testo:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

Hai già trovato una risposta? –

risposta

0

Si avrebbe neanche dovuto fare la gestione sul lato client aggiungendo i caratteri jolly alla fine dei termini di ricerca.

L'impatto: -

  1. query jolly hanno un impatto sulle prestazioni
  2. query jolly non subiscono l'analisi. Quindi l'analisi del tempo di ricerca non verrà applicata ai termini di ricerca

L'altra opzione è quella di implementare un parser di query personalizzato con la gestione di cui hai bisogno.

1

Ho avuto lo stesso requisito per un progetto. Ho dovuto implementare suggerimenti. Quello che ho fatto è stata la definizione di questo suggester fieldType

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

ho usato ShingleFilterFactory perché avevo bisogno di ottenere suggestione composto da una o più parole.

Quindi ho utilizzato query di faceting per ottenere suggerimenti.

Facet.Limit = 10

Facet.Prefix = "libro"

Facet.Field = "Suggester" // questo è il campo con fieldType = "suggester" in cui ho salvato i dati

So che usa risultati sfaccettati ma forse risolve il problema.

Se la mia o Jayendra Patil's answer non ti forniscono una soluzione si può anche dare un'occhiata a EdgeNGramFilterFactory

2

Ci sono diversi modi per farlo, ma le prestazioni saggio si potrebbe desiderare di utilizzare EdgeNgramFilterFacortory

0

I' Sono sicuro che l'hai capito, ma c'è una risposta qui:

Ho gestito questo prendendo l'ultimo termine e mettendo un OR con l'ultimo termine più un carattere jolly, ad esempio "il mio libro preferito" diventa "il mio + preferito + (libro O libro *)" e restituisce "il mio bookshelf preferito". Probabilmente vorrai comunque eseguire qualche elaborazione sull'input (escape, ecc.).

Se cerchi specificamente il testo digitato per corrispondere all'inizio del risultato, allora i margini n-grammi sono la strada da percorrere, ma dalla lettura della tua domanda non sembrava che lo stavi davvero chiedendo.

Problemi correlati