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 il quale 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, per esempio 100) record che corrispondono alla stringa nel campo di testo. Quando digito o cancelli 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 la 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 nel caricare gli elementi corrispondenti dal database. Inoltre, la memorizzazione nella cache degli elementi nella memoria principale può rendere più veloce il recupero.
Penso che il problema principale sia come trovare rapidamente gli elementi corrispondenti, data la stringa del modello. Posso fare affidamento su alcuni servizi DBMS o devo costruire un indice in memoria da solo? Qualche idea?
Modifica
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 diverse directory (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 dimostrativo Lucene è piuttosto veloce. La suddivisione e l'indicizzazione hanno richiesto alcuni minuti: per me è assolutamente accettabile perché si tratta di un set di dati statici che desidero interrogare.
Il passo successivo è quello di integrare Lucene nel programma principale e utilizzare i risultati restituiti da Lucene per caricare i record pertinenti nella memoria principale.