Dati indice in Lucene distribuita
Lucene distribuito consente una ricerca efficiente indicizzando i documenti, dove gli indici devono essere creati e archiviati in una directory. Il primo passo è quello di inizializzazione la directory che memorizza gli indici. A differenza di Lucene.NET, NCacheDirectory
viene utilizzato per aprire una directory specificando il nome della cache e il nome dell'indice.
Note:
Questa funzionalità è disponibile anche in NCache Professional.
Note:
Il percorso predefinito per la directory dell'indice è C: \ ProgramData \ncache\indice-lucene\{NOME_CACHE}\data per Windows e /utente/condividi/ncache/indice-lucene/{NOME_CACHE}/dati per Linux.
Una volta inizializzata la directory, IndexWriter
si apre fornendo l'istanza di NCacheDirectory
e la IndexWriterConfig. IndexWriter
aggiunge e indicizza i documenti sull'indice con lo stesso meccanismo di Lucene.NET utilizzando il AddDocument
metodo.
Note:
Per la distribuzione dei documenti tra i cache server, NCache aggiunge automaticamente a TextField
con una DocKey
campo e un valore GUID generato automaticamente in un documento se non è specificato dall'utente.
Tutte le operazioni di scrittura eseguite sugli indici sono sincrone. Essi vengono quindi restituiti all'utente solo al termine delle suddette operazioni. Ciò aggiunge coerenza e integrità dei dati a Distributed Lucene.
Consigli
Per qualsiasi operazione di scrittura sul writer, dobbiamo chiamare il metodo Commit
per salvarlo nella directory dei documenti. È necessario chiamare il commit, altrimenti non salverà le operazioni di scrittura e potrebbe anche influire sulle operazioni di ricerca sui documenti aggiunti.
A differenza di Lucene.NET, puoi aprire più writer sulla stessa directory per l'indicizzazione parallela. Una volta scritto il documento, IndexWriter.Commit
viene chiamato per rendere persistente il documento e renderlo ricercabile. Una volta che il IndexWriter
viene utilizzato per indicizzare i dati, IndexWriter.Dispose
ha bisogno di essere chiamato a liberare le risorse in uso.
Consiglio
È possibile ottenere informazioni sul completamento delle operazioni di scrittura in un'istanza utilizzando il NCache purché Boolean
proprietà IndexWriter.OperationsCompleted
.
Prerequisiti
- Per conoscere i prerequisiti standard richiesti per lavorare con all NCache Per le funzionalità lato client fare riferimento alla pagina specificata Prerequisiti dell'API lato client.
- Assicurati di aver creato e avviato una cache Lucene tramite il file NCache Centro di gestione or Interfaccia della riga di comando.
- Assicurarsi che Notifiche ai clienti sono abilitati.
- Assicurati che la tua applicazione non stia utilizzando alcuna DLL/Riferimento Lucene nativa.
- Per i dettagli dell'API fare riferimento a: NCacheelenco, Analyzer, WhiteSpace Analyzer, Indice scrittore, IndexWriterConfig, Commettere, Aggiungi documento, funzionalità di.
Indicizzazione dei dati
L'esempio seguente apre prima il file NCacheDirectory
specificando il nome della cache come LuceneCache e il nome dell'indice come Indice del prodotto. Quindi si apre un IndexWriter
nella directory specificata specificando il Analizzatore di spazi bianchi per l'analisi dei dati.
avvertimento
Le operazioni di scrittura dell'indice non sono consentite in caso di a grappolo parziale.
// Specify the Distributed-Lucene cache name
string cache = "LuceneCache";
// Specify the index name to create the indexes
string indexName = "ProductIndex";
NCacheDirectory ncacheDirectory = null;
IndexWriter indexWriter = null;
//Initializing
// Create a directory and open it on the cache and the index path
ncacheDirectory = NCacheDirectory.Open(cache, indexName);
// Specify the analyzer used to analyze data
Analyzer analyzer = new WhitespaceAnalyzer(LuceneVersion.LUCENE_48);
// Create an indexWriterConfig which holds all the configurations to create an instance of the writer
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.
LUCENE_48, analyzer);
// Create an instance of the writer
indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig
(LuceneVersion.LUCENE_48, _analyzer));
// Indexing
// Add the products information that is to be indexed
Product[] products = FetchProductsFromDB();
foreach (var prod in products)
{
// Create a document and add fields to it
Document doc = new Document();
doc.Add(new TextField("ProductID", prod.ProductID.ToString(),
Field.Store.YES));
doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO));
doc.Add(new TextField("Category", prod.Category, Field.Store.YES));
doc.Add(new TextField("Description", prod.Description, Field.Store.YES));
// Writer is created previously
indexWriter.AddDocument(doc);
}
// Calling commit on the writer saves all the write operations
indexWriter.Commit();
if(indexWriter.OperationsCompleted)
{
// All writing operations are complete
// Can proceed with other operations such as querying
}
// Dispose the indexWriter after indexing
if (indexWriter != null) indexWriter.Dispose();
// Dispose the ncacheDirectory
if (ncacheDirectory != null) ncacheDirectory.Dispose();
Note:
Dovresti chiamare Dispose
alla fine di ogni writer
altrimenti, vive nella memoria e causa perdite di memoria.
Risorse addizionali
NCache fornisce un'applicazione di esempio per Distributed Lucene on GitHub.
Vedere anche
.NETTO: Lucene.Net.Index spazio dei nomi.