Indexdaten in verteiltem Lucene
Note
Diese Funktion ist auch in verfügbar NCache Professional.
Distributed Lucene ermöglicht eine effiziente Suche durch Indizierung der Dokumente, wobei die Indizes erstellt und in einem Verzeichnis gespeichert werden müssen. Der erste Schritt ist initialisieren das Verzeichnis, das Indizes speichert. Im Gegensatz zu Lucene.NET, NCacheDirectory
dient zum Öffnen eines Verzeichnisses durch Angabe des Cachenamens und des Indexnamens.
Note
Der Standardpfad für das Indexverzeichnis ist C: \ ProgramData \ncache\lucene-index\{CACHE_NAME}\data für Windows und /Benutzer/Teilen/ncache/lucene-index/{CACHE_NAME}/data für Linux.
Sobald das Verzeichnis initialisiert ist, IndexWriter
wird durch Bereitstellen der Instanz von geöffnet NCacheDirectory
und dem IndexWriterConfig. IndexWriter
fügt die Dokumente zum Index hinzu und indiziert sie mit dem gleichen Mechanismus wie in Lucene.NET unter Verwendung von AddDocument
Methode.
Note
Für die Dokumentenverteilung zwischen den Cache-Servern NCache fügt automatisch a hinzu TextField
mit DocKey
Feld und einen automatisch generierten GUID-Wert für ein Dokument, wenn es nicht vom Benutzer angegeben wird.
Alle an den Indizes ausgeführten Schreibvorgänge erfolgen synchron. Daher werden sie erst nach Abschluss der genannten Vorgänge an den Benutzer zurückgegeben. Dies verleiht Distributed Lucene Datenkonsistenz und -integrität.
Wichtig
Für jeden Schreibvorgang auf dem Writer müssen wir die aufrufen Commit
um es im Dokumentenverzeichnis zu speichern. Commit muss aufgerufen werden, sonst werden die Schreibvorgänge nicht gespeichert und können sich auch auf die Suchvorgänge für die hinzugefügten Dokumente auswirken.
Im Gegensatz zu Lucene.NET können Sie mehrere Writer im selben Verzeichnis für die parallele Indizierung öffnen. Wenn das Dokument geschrieben ist, IndexWriter.Commit
wird aufgerufen, um das Dokument beizubehalten und durchsuchbar zu machen. Einmal die IndexWriter
dient der Indizierung der Daten, IndexWriter.Dispose
muss aufgerufen werden, um die verwendeten Ressourcen freizugeben.
Tipp
Informationen über den Abschluss von Schreibvorgängen an einer Instanz erhalten Sie über die NCache vorausgesetzt Boolean
Resorts IndexWriter.OperationsCompleted
.
Voraussetzungen:
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Stellen Sie sicher, dass Sie über die einen Lucene-Cache erstellt und gestartet haben NCache Management Center or Befehlszeilenschnittstelle.
- Stellen Sie sicher, dass Client-Benachrichtigungen sind aktiviert.
- Stellen Sie sicher, dass Ihre Anwendung keine native Lucene-DLL/-Referenz verwendet.
- Einzelheiten zur API finden Sie unter: NCacheVerzeichnis, Analyzer, WhiteSpaceAnalyzer, IndexWriter, IndexWriterConfig, Verpflichten, Dokument hinzufügen, Dokument.
Indizieren von Daten
Das folgende Beispiel öffnet zunächst die NCacheDirectory
indem Sie den Cache-Namen als angeben LuceneCache und der Indexname als ProduktIndex. Dann öffnet es ein IndexWriter
im angegebenen Verzeichnis durch Angabe der WhitespaceAnalyzer zur Analyse der Daten.
Warnung
Index-Schreiboperationen sind im Fall von a nicht erlaubt Teilcluster.
// 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
Sie sollten anrufen Dispose
am Ende von jedem writer
Andernfalls bleibt es im Speicher und verursacht Speicherverluste.
Weitere Informationen
NCache stellt eine Beispielanwendung für Distributed Lucene bereit GitHub.
Siehe auch
.NETZ: Lucene.Net.Index Namespace.