2012-03-26 4 views
5

Abbiamo un'istanza solr con 86,315.770 documenti. Utilizza fino a 4 GB di memoria e ne abbiamo bisogno per la sfaccettatura su un campo tokenizzato chiamato contenuto. La dimensione dell'indice su disco è di 23 GB.Raccomandazioni prestazioni ricerca sfaccettate

Perché stiamo sfaccettando su un campo tokenizzato? Perché vogliamo interrogare i primi "n" termini più usati su quel campo. Il problema è che sta impiegando troppo tempo per eseguire tali query. C'è un modo per migliorare i tempi quando si fa la sfaccettatura in questo modo? Qualche consiglio?

Grazie in anticipo.

+0

Stai impostando 'facet.limit'? Ho notato che tali query possono richiedere molto tempo anche con più di 100.000 record se 'facet.limit' non è impostato (nel tuo caso, a qualunque cosa' n' potrebbe essere). –

risposta

2

Poiché Solr calcola gli sfaccettature delle strutture di dati in memoria, è probabile che il calcolo degli sfaccettature sia associato alla CPU. Il codice per calcolare gli aspetti è già altamente ottimizzato (il metodo getCounts in UnInvertedField per un campo multivalore).

Un'idea sarebbe quella di parallelizzare il calcolo. Forse il modo più semplice per farlo sarebbe dividere la tua collezione in diversi frammenti come descritto in Do multiple Solr shards on a single machine improve performance?.

In caso contrario, se il termine del dizionario è sufficientemente piccolo e se le query possono richiedere un numero limitato di moduli, è possibile impostare un sistema diverso che mantenga la matrice dei conteggi per ogni coppia (termine, query). Ad esempio, se si accettano solo query a termine, ciò significa che si dovrebbero mantenere i conteggi per ogni coppia di termini. Fai attenzione che ciò richiederebbe molto spazio su disco a seconda del numero totale di termini e query. Se non si richiede che i conteggi siano esatti, forse il più semplice sarebbe calcolare questi conteggi in un processo batch. Altrimenti, potrebbe essere (possibile, ma) un po 'complicato mantenere i conteggi sincronizzati con Solr.

0

È possibile utilizzare la funzionalità topTerms di LukeRequestHandler.

+0

Problema è necessario applicare il termine count a una query. È possibile con topTerms? – rreyes1979

+0

Dovresti impostare il parametro 'numTerms' della richiesta Luke su qualunque # vuoi, simile all'utilizzo di' facet.limit' come spiegato nel mio commento sopra. Tuttavia, Luke restituirà numeri # diversi per i termini nel tuo indice rispetto alla sfaccettatura plain-vanilla poiché Luke restituisce i topTerm per i documenti nel tuo indice che non sono più ricercabili (ovvero quelli che sono stati eliminati ma non ancora uniti). –

+0

Inoltre, ho testato la velocità di Luke contro la sfaccettatura e invariabilmente richiede più tempo. Detto questo, se si utilizza Solr 3.6 o 4.0, ci sono presunti miglioramenti della velocità in LukeRequestHandler in quelle versioni. –