Ok, como vamos começar? Primeiro de tudo isso é escrito com base no Lucene 3.6. O NRTManager é usado para cenários quase em tempo real, nos quais a escrita e a leitura são muito próximas uma após a outra. Um exemplo seria o Twitter (que está realmente usando uma versão modificada do Lucene). Nesses casos, você não deve fechar o IndexWriter, pois todas as alterações que ocorrem estão sendo rastreadas pelo NRTManager.TrackingIndexWriter - use o NRTManagerReopenThread para disparar periodicamente as atualizações nos Threads do Searcher.
Para cenários não em tempo real, você prefere usar o SearcherManager para adquirir o IndexSearcher e uma instância do IndexWriter para gravar Documentos. Depois que um conjunto de documentos for gravado no índice (ou em base aleatória), use o ReferenceManager.maybeRefresh (estendido pelo SearcherManager) para atualizar os threads do pesquisador.
Para resumir:
- Você pode ter uma única instância do IndexWriter e confirmar suas alterações. Você pode também ter vários threads de escrita IndexWriter em um índice com ConcurrentMergeScheduler.
- Feche seu IndexWriter apenas se você tiver certeza de que não tem nenhuma alteração a fazer no índice (lembre-se de que é muito litorâneo abrir um IndexWriter)
- Você nunca envia um NRTManager, pois todas as alterações estão sendo rastreadas.