Avere una singola istanza 'IndexWriter' in Lucene è una buona idea?

5

Sto cercando di capire come dovrebbe essere usato Lucene.

Da quanto ho letto, la creazione di un IndexReader è costosa, quindi usare una Search Manager shoulg è la scelta giusta. Tuttavia, un SearchManager dovrebbe essere prodotto da un NRTManager (che, a proposito, dovrebbe sostituire IndexWriter per ogni operazione di aggiunta o cancellazione eseguita). Ma per avere un NRTManager , dovrei prima avere un IndexWriter , e qui arriva il mio problema.

La documentazione dice:

  • un IndexWriter è thread-safe
  • il costruttore di questa classe prende un oggetto Directory , quindi sembra che la creazione di una instace sia costosa (come nel caso di IndexReader)
  • tutte le modifiche sono bufferizzate e scaricate periodicamente (quindi sembrano incoraggiare l'uso di una singola istanza)

    ma

  • le modifiche, anche se svuotate saranno visibili solo dopo commit o close

  • dopo aver completato gli aggiornamenti (aggiungi / elimina), l'istanza deve essere chiusa
  • Ho anche trovato questo: link dove si dice che non chiudere uno scrittore potrebbe rovinare tutto

Quindi cosa dovrei fare? Sta avendo una singola istanza di IndexWriter una buona idea (fai solo commit e mai close it?)

EDIT: Inoltre, se utilizzo NRTManager , come posso creare commit ? È persino possibile?

    
posta Dragos 18.03.2012 - 22:31
fonte

1 risposta

4

Ok, come iniziare. Prima di tutto questo è scritto sulla base di Lucene 3.6. NRTManager è utilizzato per scenari Near-Realtime in cui scrittura e lettura sono molto ravvicinati. Un esempio sarebbe Twitter (che in realtà utilizza una versione modificata di Lucene). In questi casi, non è necessario chiudere IndexWriter poiché tutte le modifiche che si verificano vengono tracciate da NRTManager.TrackingIndexWriter - utilizzare NRTManagerReopenThread per attivare periodicamente gli aggiornamenti sui thread di ricerca.

Per scenari non in tempo reale preferisci utilizzare SearcherManager per acquisire IndexSearcher e un'istanza di IndexWriter per scrivere documenti. Dopo che una serie di documenti è stata scritta nell'indice (o in una base casuale), utilizzare ReferenceManager.maybeRefresh (esteso da SearcherManager) per aggiornare i thread di ricerca.

Per riassumere:

  • È possibile avere una singola istanza di IndexWriter e confermare le modifiche. Puoi anche avere più thread di IndexWriter che scrivono su un indice con ConcurrentMergeScheduler.
  • Chiudi IndexWriter solo se sei sicuro di non avere alcuna modifica da fare sull'indice (ricorda che è molto salato aprire un IndexWriter)
  • Non si commette mai un NRTManager poiché tutte le modifiche vengono tracciate.
risposta data 04.05.2012 - 19:48
fonte

Leggi altre domande sui tag