Qual è la tecnica di indicizzazione dei dati più efficiente


10

Come tutti sappiamo, esistono alcune tecniche di indicizzazione dei dati, che vengono utilizzate da app di indicizzazione ben note, come Lucene (per Java) o Lucene.NET (per .NET), MurMurHash, B + Tree ecc. Per un oggetto No-Sql / Database orientato (che cerco di scrivere / riprodurre un po 'con C #), quale tecnica suggerisci?

Ho letto di MurMurhash-2 e specialmente i commenti v3 dicono che Murmur è molto veloce. Anche Lucene.Net ha buoni commenti al riguardo. Ma che dire delle loro impronte di memoria in generale? Esiste una soluzione efficiente che utilizza meno footprint (e ovviamente se è preferibile una velocità maggiore) rispetto a Lucene o Murmur? O dovrei scrivere una struttura di indice speciale per ottenere i migliori risultati?

Se provo a scrivere il mio, allora esiste una scala accettata per una buona indicizzazione, qualcosa come l'1% del nodo dati o il 5% del nodo dati? Ogni suggerimento utile sarà apprezzato.

Risposte:


10

Penso che tu abbia incasinato alcune cose nella tua domanda. Lucene (non so nulla di Lucene, NET, ma suppongo sia lo stesso) è una libreria utilizzata per analizzare, dividere in token e archiviare documenti per poterli interrogare e recuperarli in seguito. Lucene ha un modello piuttosto vecchio ma efficace, usa alberi invertiti per trovare e recuperare documenti. Senza ulteriori dettagli, tutti i documenti sono suddivisi in token (termini) e per ogni termine viene mantenuta una struttura di dati, che memorizza tutti i documenti che contengono il termine specificato. Poiché una struttura di dati può essere utilizzata, una BTree, una tabella di hash e nelle ultime revisioni principali è persino possibile collegare le proprie strutture di dati.

Un BTree (vedere la pagina Wikipedia per ulteriori dettagli), è una specie di struttura di dati ad albero, che è appropriata per lavorare con grossi blocchi di dati e viene spesso usata per archiviare strutture ordinate ad albero su disco. In memoria altri alberi hanno prestazioni migliori.

Hash Murmur (vedi la pagina Wikipedia per ulteriori dettagli), è una famiglia di funzioni hash utilizzate nella tabella hash. L'implementazione della tabella hash non è importante, potrebbe essere un'implementazione concatenata standard o uno schema di indirizzamento hash aperto più avanzato. L'idea è che le tabelle hash consentono di ottenere velocemente una chiave, da un set di chiavi non ordinato, e possono rispondere ad attività come: questa chiave fa parte di questo set di chiavi? qual è il valore associato a questa chiave?

Ora torniamo al tuo problema principale. Hai una libreria (Lucene) e alle strutture di dati, entrambe le strutture di dati sono usate in Lucene. Ora vedi che non è possibile rispondere alla tua domanda in questi termini poiché non sono comparabili.

Tuttavia, per quanto riguarda il footprint e le prestazioni della parte della domanda. Prima di tutto devi sapere che tipo di operazioni devi implementare.

Hai solo bisogno di ottenere valore per la chiave o devi trovare tutti gli elementi in un intervallo? In altre parole, hai bisogno di ordine o no? Se lo fai, allora un albero può aiutare. In caso contrario, è possibile utilizzare una tabella hash, che è più veloce.

Hai molti dati che non si adattano alla memoria? Se sì, una soluzione basata su disco sarebbe di aiuto (come BTree). Se i tuoi dati si adattano alla memoria, usa la soluzione in memoria più veloce e usa il disco solo come memoria (con una struttura diversa, molto più semplice).


Grazie mille Rapaio :) I punti che mi hai dato sono molto utili e ottengono qualcosa di più chiaro .. Dal momento che sono uno sviluppatore .NET e curioso su C (inizio a imparare) e ancd nuovo, veloce, affidabile, scalabile ovviamente completamente controllabile - a breve termine: molto eccitato - tecniche .. Quindi ho bisogno di imparare molto..Per imparare, provo a leggere tanti documenti ma come puoi immaginare sono alla linea di partenza .. Non sapevo che BTree abbia dei vantaggi su disco (nel mondo .Net, così tanti scrittori lo spiegano in questo modo: una struttura gerarchica di dati come Linked-List..No di più!) Grazie ancora
sihirbazzz,

E se mi permetti, fino a quando non ci sarà una spiegazione / risposta di qualità superiore alla tua, voglio accettarlo come risposta .. E a proposito, Lucene.NET è un'implementazione .NET di Lucene di Java
sihirbazzz,
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.