2009-06-13 15 views
5

Sto lavorando a un progetto in cui avrò un sacco di dati, e sarà ricercabile in varie forme che sono espresse molto efficientemente come query SQL, ma deve anche essere ricercata tramite l'elaborazione del linguaggio naturale.Le migliori pratiche per combinare Lucene.NET e un database relazionale?

Il mio piano è quello di costruire un indice utilizzando Lucene per questa forma di ricerca.

La mia domanda è che se faccio questo, ed eseguo una ricerca, Lucene restituirà quindi l'ID dei documenti corrispondenti nell'indice, quindi devo cercare queste entità dal database relazionale.

Ciò potrebbe essere fatto in due modi (che mi viene in mente finora):

  • N quantità di query (orribile)
  • passare tutti gli ID per una stored procedure in una sola volta (forse come un parametro delimitato da virgola). Questo ha lo svantaggio di essere limitato alla dimensione massima del parametro e il rallentamento delle prestazioni di una UDF per dividere la stringa in una tabella temporanea.

Sono quasi tentato di eseguire il mirroring di tutto nell'indice di lucenes, in modo da poter generare periodicamente l'indice dal backing store, ma è necessario solo accedervi per il frontend.

Consigli?

+0

Ciao. Hai finito il tuo progetto? Che cosa hai fatto? – Eduardo

risposta

2

Quando ho riscontrato questo problema sono andato con un database relazionale che ha funzionalità di ricerca full-text (ho usato PostgreSQL 8.3, che ha integrato il supporto ft, con il supporto per gli utenti e il thesaurus). In questo modo il database può eseguire query utilizzando entrambi i comandi SQL e ft. Il rovescio della medaglia è che hai bisogno di un DB che abbia funzionalità di ricerca full-text, e queste capacità potrebbero essere inferiori a ciò che Lucene può fare.

4

Vorrei memorizzare i dati "frontend" all'interno dell'indice stesso, evitando qualsiasi interazione db. Il db verrebbe interrogato solo quando vuoi maggiori informazioni sul record specifico.

1

Immagino che la risposta dipenda da cosa farai con i risultati, se vuoi mostrare i risultati in una griglia e lasciare che l'utente scelga il documento esatto a cui vuole accedere, quindi potresti voler aggiungere l'indice di testo sufficiente per aiutare l'utente a identificare il documento, come un blurb di dire 200 caratteri e poi, una volta che il membro seleziona un documento, colpisce il DB per recuperare l'intera cosa.

Ciò influirà sicuramente sulla dimensione dell'indice, quindi è un'altra considerazione da tenere a mente. Metterei anche una cache tra il DB e il front-end in modo che gli elementi più utilizzati non incorressero il costo totale di un accesso DB ogni volta.

+0

Penso che Lucene abbia il caching in-memory. No? –

0

Probabilmente non un'opzione in base a quanta roba è presente nel database, ma ciò che ho fatto è memorizzare gli ID db nell'indice di ricerca insieme alle proprietà che volevo indicizzate. Quindi nelle mie classi di servizio memorizzo nella cache tutti i dati necessari per visualizzare i risultati di ricerca per tutti gli oggetti (ad es. Nome, ID db, URL immagine, descrizione descrizione, informazioni sui social media). La classe di servizio restituisce un dizionario che può cercare oggetti con db id e io uso gli id ​​restituiti da Lucene.NET per estrarre i dati dalla cache in memoria.

È anche possibile rinunciare alla cache in memoria e memorizzare tutte le proprietà necessarie per la visualizzazione di un risultato di ricerca nell'indice di ricerca. Non l'ho fatto perché la cache in memoria è utilizzata anche in scenari diversi dalla ricerca.

La cache in memoria è sempre fresca entro poche ore e l'unica volta che devo colpire il db è se ho bisogno di estrarre dati più dettagliati per un singolo oggetto (se l'utente fa clic sul link per un oggetto specifico per andare alla pagina per quell'oggetto).

Problemi correlati