Come funziona Lucene


90

Vorrei scoprire come funziona la ricerca di Lucene così velocemente. Non riesco a trovare alcun documento utile sul Web. Se hai qualcosa (a parte il codice sorgente di Lucene) da leggere, fammelo sapere.

Una query di ricerca di testo che utilizza la ricerca di testo mysql5 con indice richiede circa 18 minuti nel mio caso. Una ricerca lucene per la stessa query richiede meno di un secondo.


2
Posso richiedere che questa domanda venga convertita come wiki della comunità? Lucene ora suona come una piattaforma.
asyncwait

Risposte:


75

Lucene è un indice full-text invertito. Ciò significa che prende tutti i documenti, li divide in parole e quindi crea un indice per ogni parola . Poiché l'indice è una corrispondenza di stringa esatta, non ordinata, può essere estremamente veloce. Ipoteticamente, un indice SQL non ordinato su un varcharcampo potrebbe essere altrettanto veloce, e in effetti penso che scoprirai che i grandi database possono eseguire una semplice query di uguaglianza di stringhe molto rapidamente in quel caso.

Lucene non deve ottimizzare per l'elaborazione delle transazioni. Quando si aggiunge un documento, non è necessario assicurarsi che le query lo vedano immediatamente . E non è necessario ottimizzare per gli aggiornamenti ai documenti esistenti.

Tuttavia, alla fine della giornata, se vuoi davvero saperlo, devi leggere la fonte. Entrambe le cose a cui fai riferimento sono open source, dopotutto.


Se ho capito bene, la cosa che distingue i motori di ricerca di testo è il modo in cui gestiscono le ricerche di più parole e uniscono i risultati delle ricerche a più indici in tempo reale. Non suggerirei di consultare la fonte di Lucene per questo. Probabilmente sarebbe meglio leggere un po 'sulla teoria della ricerca di testo, la risposta di @ alienCoder mi ha aiutato.
Chris Dutrow,

1
@bmargulies, se l'indicizzazione è "a parola", allora perché l'utente StackOverflow di ricerca stackoverflow.com/users permettono sottostringa partite?
Pacerier

2
Questo non è il posto giusto per le risposte dell'intero libro. Ci sono un certo numero di elaborazioni sul concetto di base lì.
bmargulies

Cosa intendi con "un indice per ogni parola" ... se inizio a digitare "abc", come troverà "abc" nel documento?
Alexander Mills

1
Un indice (B-tree) da parola a documento può cercare documenti per parole nel documento perché la tabella di tale indice è (parola, documento) dove l'indice si trova sulla colonna parola. Considera una query come: "Trova documenti contenenti le parole" polizia "," crimine "," statistiche "". Effettuando una ricerca nell'indice delle parole, è possibile eseguire tre ricerche log (N) per ottenere O (N) documenti con una di quelle parole al loro interno. Quindi puoi fare due cicli O (N) per costruire un set contenente documenti che hanno tutte e tre le parole. Sebbene questa sia teoricamente un'operazione O (N), la maggior parte dei documenti non ha tutte e tre le parole quindi è O (n) dove n <N.
Calicoder

34

Lucene crea un grande indice. L'indice contiene l'ID parola, il numero di documenti in cui è presente la parola e la posizione della parola in quei documenti. Quindi, quando si esegue una query su una singola parola, viene eseguita la ricerca nell'indice (O (1) complessità temporale). Quindi il risultato viene classificato utilizzando diversi algoritmi. Per le query di più parole basta prendere l'intersezione del set di file in cui sono presenti le parole. Quindi Lucene è molto molto veloce.

Per maggiori informazioni leggi questo articolo degli sviluppatori di Google: http://infolab.stanford.edu/~backrub/google.html


8
Scorrendo quel foglio, è stato molto utile. Nello specifico "4.5 Ricerca" aveva la risposta che stavo cercando. In particolare, sembra che una ricerca hash O (1) venga utilizzata per singole parole, ma poi viene utilizzata una scansione O (n) per unire i risultati con un limite di 40.000 documenti. Presumo che venga utilizzato un algoritmo di riduzione della mappa per suddividere questo lavoro in modo che l'utente ottenga risultati istantanei.
Chris Dutrow

Un algoritmo popolare è l'algoritmo di classificazione dei piccioni. Anche se non ne so molto.
alienCoder

3
Quel documento è divertente: "In questo documento, presentiamo Google, un prototipo ...". Immagino che Google non sia sempre stata una mega-società.
Buttons840

non conosco Lucene, ma una domanda: il posizionamento avviene ad ogni ricerca? Oppure mantiene i documenti pre-classificati? Se mantiene in anticipo i documenti in base al rango, come mantiene la query di più parole?
Vikas Prasad

Il collegamento ora è interrotto. @alienCoder
CEGRD

20

In una parola: indicizzazione.

Lucene crea un indice del tuo documento che gli permette di cercare molto più velocemente.

È la stessa differenza tra una struttura dati della lista O (N) e una struttura dati della tabella hash O (1). L'elenco deve scorrere l'intera raccolta per trovare ciò che desideri. La tabella hash ha un indice che gli consente di capire esattamente dove si trova l'elemento desiderato e di recuperarlo semplicemente.

Aggiornare:

Non sono sicuro di cosa intendi per "le ricerche nell'indice Lucene sono molto più veloci delle ricerche nell'indice mysql".

La mia ipotesi è che tu stia usando MySQL "WHERE document LIKE '% phrase%'" per cercare un documento. Se questo è vero, MySQL deve eseguire una scansione della tabella su ogni riga, che sarà O (N).

Lucene può analizzare il documento in token, raggrupparli in n-grammi secondo la tua direzione e calcolare gli indici per ciascuno di essi. È O (1) trovare una parola in un documento Lucene indicizzato.


10
Sì, capisco la parte dell'indicizzazione, ma ancora una volta, le ricerche nell'indice di lucene sono molto più veloci delle ricerche nell'indice di mysql. Come può accadere
Midhat

8

Lucene lavora con la frequenza del termine e la frequenza del documento inverso . Crea un indice che mappa ogni parola con il documento e il suo conteggio della frequenza che non è altro che un indice inverso sul documento.

Esempio :

File 1: la memoria ad accesso casuale è la memoria principale.

File 2: i dischi rigidi sono la memoria secondaria.

Lucene crea un indice inverso qualcosa di simile

File 1:

Termine: casuale

Frequenza: 1

Posizione: 0

Termine: memoria

Frequenza: 2

Posizione: 3

Posizione: 6

Quindi è in grado di cercare e recuperare rapidamente il contenuto cercato. Quando ci sono troppe corrispondenze per la query di ricerca, restituisce il risultato in base al peso. Considera la query di ricerca "Memoria principale" , cerca tutte e 4 le parole individualmente e il risultato sarebbe,

Principale

File 1: Frequenza - 1

Memoria

File 1: Frequenza - 2

File 2: Frequenza - 1

Il risultato sarebbe File1 seguito da File2 . Per smettere di lasciarsi trasportare dai pesi sulle parole più comuni come "e", "o", "il" considera la frequenza del documento inversa (cioè "diminuisce il peso della parola che è più popolare nel set di documenti).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.