Está tendo uma única instância 'IndexWriter' no Lucene uma boa ideia?

5

Estou tentando entender como o Lucene deve ser usado.

Pelo que li, criar um IndexReader é caro, portanto, usar um Search Manager shoulg será a escolha certa. No entanto, um SearchManager deve ser produzido por um NRTManager (que, a propósito, deve substituir o IndexWriter para cada operação de adição ou exclusão executada). Mas para ter um NRTManager , primeiro devo ter um IndexWriter , e aí vem o meu problema.

A documentação diz:

  • um IndexWriter é thread-safe
  • o construtor desta classe usa um objeto Directory , então parece que criar uma instância deve ser caro (como no caso de um IndexReader)
  • todas as alterações são armazenadas em buffer e liberadas periodicamente (portanto, elas parecem encorajar o uso de uma única instância)

    mas:

  • as alterações, embora liberadas, só serão visíveis após commit ou close

  • depois de concluir as atualizações (adicionar / excluir), a instância deve ser fechada
  • Também encontrei o seguinte: link onde se diz que não fechar um escritor pode estragar tudo

Então o que eu realmente devo fazer? Ter uma única IndexWriter instância é uma boa ideia (faça apenas commit e nunca close it)?

EDITAR: Além disso, se eu usar NRTManager , como posso criar um commit ? É mesmo possível?

    
por Dragos 18.03.2012 / 22:31
fonte

1 resposta

4

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.
por 04.05.2012 / 19:48
fonte