2011-01-07 2 views
12

Sono nuovo in Lucene.NET ma sto utilizzando an open source tool creato per Sitecore CMS che utilizza Lucene.NET per indicizzare molti contenuti dal CMS. Ho confermato ieri che quando ricostruisco i miei indici, i file di indice correnti si cancellano, quindi tutto ciò che si basa sull'indice non riceve dati per circa 30-60 secondi (la quantità di tempo necessaria per una ricostruzione completa dell'indice). Esiste una best practice o un modo per fare in modo che Lucene.NET non sovrascriva i file di indice correnti finché il nuovo indice non viene completamente ricostruito? Fondamentalmente sto pensando che mi piacerebbe che scrivesse su nuovi file indice temporaneo e quando la ricostruzione è terminata, quei file sovrascrivono l'indice corrente.Evitare la rimozione dell'indice Lucene.NET corrente durante la ricostruzione

esempio di che cosa sto parlando:

  • creazione dell'indice fresco (~ 30 secondi)
  • Indice ha circa 500 documenti
  • codice
  • Utilizzare per accedere ai dati di indice e visualizzazione sul sito
  • Ricostruisci indice (~ 30 secondi)
    • Qualsiasi codice che ora legge l'indice per i dati non restituisce nulla perché i file di indice sono essendo overwritte n; risultati in sito non mostrando alcun dato
  • Rebuild completa: i dati ora disponibili ancora una volta, i dati di nuovo sul sito web

Grazie in anticipo

+1

È possibile aprire un indice in modalità di aggiunta, nel qual caso l'indice corrente rimane disponibile fino a quando non si esegue il flush o il commit delle nuove scritture. – Mikos

risposta

6

non ho esperienza con "Sitecore" in sé, ma qui è la mia storia.

Abbiamo recentemente incorporato la ricerca basata su indice (utilizzando Lucene.Net) per il nostro sottosistema eCommerce. Il processo di aggiornamento dell'indice per il nostro caso potrebbe richiedere circa mezz'ora (circa 50.000 prodotti stessi + molte informazioni correlate). Per evitare una risposta "denial of service" durante l'aggiornamento dell'indice, prima creiamo una versione "di backup" della stessa (semplicemente copiando la directory dell'indice in un'altra posizione) e tutte le ulteriori richieste vengono reindirizzate per utilizzare questa versione di "backup". Una volta completato l'aggiornamento dell'indice, eliminiamo il backup in modo che i client possano iniziare a utilizzare la versione aggiornata (o "live") dell'indice. Ciò è utile anche in caso di eventuali eccezioni non gestite che potrebbero verificarsi durante il processo di aggiornamento perché si rischia di non avere alcun indice (e nel nostro caso i client possono sempre utilizzare la versione "backup").

Il API reference (Lucene 2.4) delle Lucene.Net.Index.IndexWriter stati oggetto i seguenti:

Nota che è possibile aprire un indice con create=true anche quando i lettori sono utilizzando l'indice. I vecchi lettori saranno continuare a cercare lo snapshot "point in time" che avevano aperto, e non lo saranno vedere l'indice appena creato finché non si riapre lo .

Quindi almeno non dovresti preoccuparti dei client che stanno attualmente cercando all'interno del tuo indice.

Spero che questo ti aiuti a prendere una decisione giusta.

1

Non ho familiarità con quello strumento sitecore, ma posso rispondere come lo faresti con puro Lucene.Rete: è necessario utilizzare un setup NRT, che significa "avere un writer dell'indice e non chiuderlo mai".

Fondamentalmente, gli indici di scrittura hanno un indice "virtuale" in memoria fino a quando non viene scaricato su disco. Quindi, se dai tuoi lettori arriva lo scrittore, vedrai sempre le ultime cose, anche se non sono ancora state scaricate su disco.