2010-05-06 8 views
5

Sto provando a cercare corrispondenze iniziali parziali su una lunga lista di cognomi. Così Wein * dovrebbe trovare Weinberg, Weinkamm eccCome eseguire le partite di inizio parziale in Solr?

ho potuto farlo creando un campo speciale, e l'aggiunta di

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" preserveOriginal="1"/>

alla sua specifica tipologia in schema.xml. Quando aggiungo la riga in alto solo all'analizzatore di indicizzazione e la lascio vuota per l'analizzatore di query, posso quindi effettuare una ricerca cercando solo in special_field: Wein e ottenere i risultati previsti.

Ora vedo che solr ha anche un * -sintassi. Qual è la connessione tra EdgeNGramFilterFactory e * -syntax?

Sto facendo le cose correttamente o c'è un modo migliore, più regolare?

Grazie!

risposta

1

Non consiglio la query Wein *. Questo viene implementato internamente come PrefixQuery, che riscrive la query originale per includere tutti i termini che hanno il prefisso uguale a "Wein". A seconda di quanto grande è il tuo indice (intendo quanti termini), questa riscrittura può essere un collo di bottiglia.

EdgeNGramFilter al momento dell'indice è un approccio migliore. Questa soluzione utilizzerà più spazio, ma le query verranno elaborate molto più velocemente.

+0

Grazie. Non mi aspetto molti termini di ricerca, quindi sono andato con la sintassi dei caratteri jolly e ne sono abbastanza soddisfatto. – CruftyCraft

+0

Mi riferisco al numero di termini indice, non ai termini di ricerca. Solr/Lucene esegue una ricerca lineare su tutti i termini indicizzati per selezionare un sottoinsieme di termini con lo stesso prefisso. Una volta selezionato il sottoinsieme, la query viene espansa per includere tali termini. Quindi il collo di bottiglia è la ricerca lineare. Quindi, consiglio comunque EdgeNGramFilter, a meno che tu non dica che hai pochi termini nel tuo indice. – Rodes

+0

Capisco. Potrei fare gli stessi cambiamenti in questa direzione una volta raggiunto un limite di prestazioni. Grazie. – CruftyCraft

3

O semplicemente fare una semplice partita di wild card:

name:Pe* 
Problemi correlati