Configura Lucene.Net con SQL Server

Qualcuno ha usato Lucene.NET piuttosto che usare la ricerca full text fornita con SQL Server?

Se così fosse, sarei interessato a come l’hai implementato.

Ad esempio, hai scritto un servizio Windows che ha interrogato il database ogni ora, quindi i risultati sono stati salvati nell’indice lucene.net?

Sì, l’ho usato esattamente per quello che stai descrivendo. Avevamo due servizi: uno per la lettura e uno per la scrittura, ma solo perché avevamo più lettori. Sono sicuro che avremmo potuto farlo con un solo servizio (lo scrittore) e incorporato il lettore nell’app e nei servizi web.

Ho usato lucene.net come indicizzatore di database generale, quindi quello che ho ottenuto era fondamentalmente DB id (a messaggi di posta elettronica indicizzati), e l’ho anche usato per ottenere informazioni sufficienti per popolare i risultati della ricerca o simili senza toccare il Banca dati. Ha funzionato benissimo in entrambi i casi, anche se l’SQL può essere un po ‘lento, dato che è necessario avere un ID, selezionare un ID, ecc. Abbiamo risolto questo problema creando una tabella temporanea (con solo la riga ID in essa contenuta) e inserimento di massa da un file (che era l’output di lucene) per poi unirsi alla tabella dei messaggi. È stato molto più veloce.

Lucene non è perfetto, e devi pensare un po ‘al di fuori del box del database relazionale, perché in realtà non lo è, ma è molto molto bravo in quello che fa. Vale la pena dare un’occhiata, e, mi è stato detto, non ha il “oops, mi dispiace, è necessario ribuild nuovamente il tuo indice” problemi che fa FTI di MS SQL.

A proposito, avevamo a che fare con 20-50 milioni di e-mail (e circa 1 milione di allegati unici), per un totale di circa 20 GB di indice lucene, e 250 + GB di database SQL + allegati.

Le prestazioni sono state fantastiche, per non dire altro – assicuratevi solo di pensare e modificare i vostri fattori di fusione (quando unisce i segmenti dell’indice). Non vi è alcun problema nell’avere più di un segmento, ma ci può essere un GRANDE problema se si tenta di unire due segmenti che contengono 1mil elementi in ciascuno, e si ha un thread watcher che uccide il processo se ci vuole troppo tempo … .. (sì, quello ci ha preso a calci in culo per un po ‘). Quindi mantieni il numero massimo di documenti per thinggie LOW (cioè, non impostarlo su maxint come abbiamo fatto!)

EDIT Corey Trager ha documentato come utilizzare Lucene.NET in BugTracker.NET qui .

Non l’ho ancora fatto con il database, la tua domanda è abbastanza aperta.

Se vuoi cercare un db e puoi scegliere di usare Lucene, immagino anche che tu possa controllare quando i dati vengono inseriti nel database. Se è così, c’è poco motivo per interrogare il db per scoprire se è necessario reindicizzare, basta indicizzare mentre si inserisce, o creare una tabella di code che può essere usata per dire a lucene cosa indicizzare.

Penso che non abbiamo bisogno di un altro indicizzatore che ignori ciò che sta facendo, e che reindicizzi ogni volta, o utilizzi risorse inutili.

Ho usato lucene.net anche come motore di archiviazione, perché è più facile distribuire e configurare macchine alternative con un indice che un database, è solo una copia del filesystem, puoi indicizzare su una macchina e copiare i nuovi file sulle altre macchine distribuire l’indice. Tutte le ricerche e i dettagli sono mostrati dall’indice di lucene e il database è usato solo per la modifica. Questa configurazione è stata dimostrata come una soluzione molto scalabile per le nostre esigenze.

Per quanto riguarda le differenze tra sql server e lucene, il problema principale con la ricerca full text di sql server 2005 è che il servizio è disaccoppiato dal motore relazionale, quindi unisce, ordina, aggrega e filtra tra i risultati del testo completo e le colonne relazionali sono molto costose in termini di prestazioni, Microsoft afferma che questi problemi sono stati risolti in SQL Server 2008, integrando la ricerca di testo completo all’interno del motore relazionale, ma non l’ho testata. Hanno anche reso l’intera ricerca full-text molto più trasparente, nelle versioni precedenti i stemmer, le stopword e molte altre parti dell’indicizzazione dove erano simili a una scatola nera e difficili da comprendere e nella nuova versione sono più facili da vedere come funzionano.

Con la mia esperienza, se sql server soddisfa le tue esigenze, sarà il modo più semplice, se ti aspetti un sacco di crescita, query complesse o hai bisogno di un grande controllo della ricerca full text, potresti considerare di lavorare con lucene fin dall’inizio perché sarà più facile da ridimensionare e personalizzare.

Ho usato Lucene.NET insieme a MySQL. Il mio approccio era quello di memorizzare la chiave primaria del record db nel documento di Lucene insieme al testo indicizzato. In codice pseudo sembra:

  • Memorizza il record:

    inserire testo, altri dati nella tabella
    ottieni l’ultimo ID inserito
    creare un documento lucene
    mettere (ID, testo) in lucene indice di aggiornamento del documento lucene

  • Interrogazione
    cerca indice di lucene
    per ogni lucene doc in result set caricare i dati dal DB con l’ID del record memorizzato

Solo per notare, sono passato da Lucene a Sfinge a causa della sua superba prestazione

Penso che questo articolo sia un buon punto di partenza:

http://www.aspfree.com/c/a/braindump/working-with-lucene-net/