Ho il seguente problema: ho un database contenente più di 2 milioni di record. Ogni record ha un campo stringa X e voglio visualizzare un elenco di record per i quali il campo X contiene una determinata stringa. Ogni record ha una dimensione di circa 500 byte.
Per renderlo più concreto: nella GUI della mia applicazione ho un campo di testo in cui posso inserire una stringa. Sopra il campo di testo ho una tabella che mostra i (primi N, ad esempio 100) record che corrispondono alla stringa nel campo di testo. Quando scrivo o cancello un carattere nel campo di testo, il contenuto della tabella deve essere aggiornato al volo.
Mi chiedo se esiste un modo efficace per farlo utilizzando strutture di indice appropriate e / o memorizzazione nella cache. Come spiegato sopra, voglio solo visualizzare i primi N elementi che corrispondono alla query. Pertanto, per N abbastanza piccolo, non dovrebbe essere un grosso problema caricare gli elementi corrispondenti dal database. Inoltre, la memorizzazione nella cache degli elementi nella memoria principale può velocizzare il recupero.
Penso che il problema principale sia come trovare rapidamente gli oggetti corrispondenti, data la stringa del modello. Posso fare affidamento su alcune strutture DBMS o devo creare personalmente un indice in memoria? Qualche idea?
MODIFICARE
Ho eseguito un primo esperimento. Ho diviso i record in diversi file di testo (al massimo 200 record per file) e ho inserito i file in directory diverse (ho usato il contenuto di un campo dati per determinare l'albero delle directory). Finisco con circa 50000 file in circa 40000 directory. Ho quindi eseguito Lucene per indicizzare i file. La ricerca di una stringa con il programma demo Lucene è piuttosto veloce. La divisione e l'indicizzazione hanno richiesto alcuni minuti: questo è assolutamente accettabile per me perché è un set di dati statici che voglio interrogare.
Il prossimo passo è integrare Lucene nel programma principale e utilizzare gli hit restituiti da Lucene per caricare i relativi record nella memoria principale.