Überblick über verteiltes Lucene
Note
Diese Funktion ist in verfügbar NCache Unternehmen und Professionell für die Partitionierte Topologien nur.
NCache stellt ein Lucene Modul, mit dem Sie Lucene für die Textsuche verwenden können NCache. Jeder Server von NCache verfügt über ein spezielles Lucene-Modul. Dadurch ist Lucene verteilt, skalierbar und hochverfügbar NCache.
Note
NCache verwendet die 4.8-Version von Lucene.Net.
Warum Lucene mit verwenden sollte NCache?
Wie wir wissen, ist Lucene eine leistungsstarke und effiziente Suchmaschine, die eine breite Palette an Textsuchtechniken bietet, um Ihre Geschäftsanforderungen zu erfüllen. Lucene ist viel mehr als jede andere Textsuchmaschine, da dem Benutzer vielfältige Auswahlmöglichkeiten geboten werden. Es verfügt über leistungsstarke Suchalgorithmen und unterstützt eine Vielzahl von Suchabfragen.
Obwohl Lucene allein so leistungsstark ist, hat es seine Grenzen. Lucene wird prozessintern in der Clientanwendung ausgeführt. Das bedeutet, dass Lucene nicht skalierbar ist und einen einzigen Fehlerpunkt aufweist.
NCache bietet eine verteilte Implementierung von Lucene mit geringfügigen Änderungen in seiner API. Lucenes API-Aufrufe NCache im Backend. NCache Die Verteilung in der Natur mit Lucene bietet eine lineare Schreibskalierbarkeit, da die von den Anwendungen indizierten Dokumente automatisch auf Cache-Knoten verteilt werden, wo sie separat indiziert werden.
Note
Distributed Lucene verwendet anstelle des einen separaten und dedizierten Lucene-Store NCache Cache-Speicher.
In ähnlicher Weise bietet Distributed Lucene auch lineare Leseskalierbarkeit, da Abfragen auf jeder Partition weitergegeben und Ergebnisse zusammengeführt werden. Eine höhere Anzahl von Partitionen bietet eine höhere Lese- und Schreibskalierbarkeit. Lucene-Indizes werden auf Ihrem physischen Laufwerk gespeichert. Je mehr Knoten vorhanden sind, desto höher ist die Skalierbarkeit, Leistung und Speicherkapazität, um eine große Anzahl von Lucene-Dokumenten und indizierten Daten aufzunehmen.
Funktionsweise von Distributed Lucene
Wichtig
Es wird dringend empfohlen, anstelle einer Festplatte eine SSD zum Indizieren und Durchsuchen von Lucene-Dokumenten zu verwenden.
Das Verhalten und die Funktionsweise von Lucene und Distributed Lucene sind mit einigen Änderungen nahezu gleich. Der Workflow, die Datenverteilung und die Komponenten von Distributed Lucene werden in den folgenden Abschnitten erläutert:
Verteilter Lucene-Workflow
Das folgende Diagramm zeigt, wie das Distributed Lucene-Modell funktioniert.
Die Clientanwendung möchte möglicherweise Dokumente indizieren und analysieren (von unterstützten Lucene-Analyseprogrammen analysieren) oder vorhandene indizierte Dokumente mithilfe der Lucene-API abfragen. Diese Vorgänge mit der API wirken wie Remote Procedure Calls (RPCs) und werden direkt an die weitergeleitet NCache Cluster. Der Cluster bestimmt die Art dieser Aufrufe und leitet die Aufrufe an die Distributed Lucene-Module weiter, die an jeden Serverknoten angeschlossen sind. Diese Module führen diese Aufrufe aus und je nach Art der Aufrufe wird eine der folgenden Aktionen ausgeführt:
Aufruf Dokument abfragen: Falls es sich um einen Abfrageaufruf handelt, geben die Distributed Lucene-Module Ergebnisse an die Clientseite zurück, wo alle diese Ergebnisse zusammengeführt und verarbeitet werden.
Indexdokumentaufruf: Falls es sich um einen Aufruf zur Indizierung eines Dokuments handelt, behalten die Distributed Lucene-Module dieses Dokument auf einem Festplattenlaufwerk bei.
Datenverteilung
Für einen Cache-Cluster wird eine Verteilungskarte generiert. Für Distributed Lucene wird diese Karte generiert:
- Zur Cache-Erstellung.
- Beim Hinzufügen oder Entfernen eines Serverknotens.
Warnung
Falls die Verteilungskarte nicht vorhanden ist, kann der Cache nicht gestartet werden und Ausnahmen werden in der Ereignisanzeige und den Dienstprotokollen protokolliert.
Diese Karte enthält Informationen zu den Buckets gegenüber den Cache-Knoten. Die Gesamtzahl der Buckets für einen Distributed Lucene-Cache beträgt 100. Diese 100 Buckets werden im Cluster mithilfe einer bestimmten Strategie verteilt.
100 Buckets bedeuten, dass ein Index im gesamten Cache-Cluster in 100 Unterindizes aufgeteilt ist. Basierend auf der Anzahl der jedem Knoten zugewiesenen Buckets werden auch alle entsprechenden Indexdateien auf diesen bestimmten Knoten verschoben. Wenn also eine Zustandsübertragung dazu führt, dass Buckets über den Cache-Cluster verschoben werden, werden im Rahmen des Prozesses auch die entsprechenden Indexdateien verschoben.
Ein Serverknoten kann mehrere Indizes enthalten, und jeder Index innerhalb dieses Serverknotens enthält Buckets, die ihm entsprechend der Verteilungsstrategie des Clusters zugewiesen sind. Die Dokumente für die Indizes werden gleichmäßig über diese Buckets verteilt. Diese Indizes werden auch auf Ihrem physischen Laufwerk gespeichert.
NCache verfügt über eine Laufzeit- oder dynamische Verteilung. Das Starten oder Stoppen eines Knotens löst eine Änderung in der Verteilungskarte des Cache-Clusters und eine Statusübertragung aus. Allerdings in NCache Bei Distributed Lucene werden die Indizes auf Ihrem physischen Laufwerk gespeichert, um eine unnötige Verteilung von Indizes beim Starten oder Stoppen des Knotens zu vermeiden. Das heißt, dass in NCache Bei verteiltem Lucene ändert nur das Hinzufügen oder Entfernen eines Knotens aus dem Cache-Cluster die Verteilungskarte und löst eine Statusübertragung für die laufenden Serverknoten aus. Für die gestoppten Serverknoten findet die Statusübertragung statt, sobald sie wieder online sind.
Im Folgenden sind einige wichtige Punkte aufgeführt, die Sie beachten sollten NCache Verteiltes Lucene:
- Verbreitungskarte des Caches: Die Verteilungskarte eines neuen Caches wird nur generiert, wenn die Cache-Erstellung erfolgreich ist. Wenn die Generierung der Verteilungskarte aus irgendeinem Grund fehlschlägt, wird die Cache-Erstellung rückgängig gemacht (zurückgesetzt).
- Zustandsübertragung: Jede Änderung in der Konfiguration der Cache-Cluster-Mitgliedschaft führt zu Änderungen in der Verteilungskarte, da dadurch eine Statusübertragung im Cache-Cluster ausgelöst wird.
- Knotenhinzufügung zu einem vorhandenen Cluster: In diesem Fall sollten alle Serverknoten (auch der hinzugefügte) physisch verfügbar sein und ihr Dienst sollte ausgeführt werden. Wenn ein Knoten zum Distributed Lucene-Cache-Cluster hinzugefügt wird, wird die vorhandene Verteilungskarte von den vorhandenen Serverknoten abgerufen. Anschließend wird eine neue Verteilungskarte generiert und mit allen Serverknoten geteilt. Es wird ein Commit-Aufruf gesendet, um diese Verteilungszuordnung beizubehalten.
- Knotenentfernung aus einem vorhandenen Cluster: In diesem Fall sollten, ähnlich wie beim Hinzufügen von Knoten zu einem vorhandenen Cluster, alle Serverknoten (mit Ausnahme des Knotens, der entfernt wird) physisch verfügbar sein und ihr Dienst sollte ausgeführt werden. Andernfalls schlägt dieser Vorgang fehl.
- Knotenabschaltung während der Statusübertragung: Wenn ein Serverknoten während der Statusübertragung heruntergefahren wird, wird die Statusübertragung für diesen Knoten angehalten und vom selben Bucket (in dem der Knoten heruntergefahren wird) wieder aufgenommen, wenn der Knoten erneut gestartet wird.
Wichtig
Im Falle einer Entwicklerinstallation können Geschäfte Distributed Lucene konfigurieren.
Verteiltes Lucene initialisieren
Bevor Sie Distributed Lucene verwenden, um Ihre Dokumente zu indizieren und anschließend zu durchsuchen, müssen Sie dies tun initialisieren es zuerst. Nachdem Sie es initialisiert haben, müssen Sie den Cache-Namen und den Indexnamen angeben.
Indexdaten
Der Indizierungsprozess in Distributed Lucene ist derselbe wie in Lucene selbst. Im Fall von Distributed Lucene: NCache verwaltet einen Schlüsselwertspeicher für die Verteilung von Dokumenten und jedem Dokument wird ein automatisch generierter Schlüssel hinzugefügt. Das Dokument wird auf dem Knoten anhand dieses spezifischen Schlüssels indiziert.
Indexsuche
Sobald Distributed Lucene initialisiert und Ihre Dokumente indiziert wurden, können Sie textbasierte Suchen in diesen Dokumenten durchführen.
Facetten
Eine Kategorie ist ein wesentlicher Aspekt eines indizierten Dokuments, der zu seiner Klassifizierung verwendet wird. Wenn Sie beispielsweise in einem E-Commerce-Shop nach Kleidung suchen, können die Kategorien der Kleidung Preis, Material, Marke usw. sein.
Bei der Facettensuche erhalten Sie zusätzlich zu den normalen Suchergebnissen auch Facettenergebnisse, die aus Unterkategorien für bestimmte Kategorien bestehen. In Fortführung des obigen Beispiels können die Unterkategorien für Materialaspekte Baumwolle, Wolle, Leder usw. sein.
Die Facettensuche erleichtert Ihnen die Suche nach bestimmten Dokumenten, die Sie benötigen. NCache Unterstützt jetzt Facets mit Distributed Lucene, was Ihnen bei den gewünschten Dokumenten effizient und effektiv hilft. Die Funktionsweise der Facetten in Lucene und Distributed Lucene ist größtenteils gleich, weist jedoch viele Leistungsverbesserungen auf, die in hervorgehoben werden Verteilte Lucene-Facetten.
Geo-Spatial-API
Daten, die Koordinatenwerte für Längen- und Breitengrad enthalten, werden als bezeichnet Geodaten. Diese Daten sind nützlich, wenn Sie Daten anhand ihres Standorts durchsuchen möchten. Sie möchten beispielsweise ein Dokument indizieren, das Informationen zu einem Restaurant enthält. Dieses Dokument enthält verschiedene Felder, und eines dieser Felder enthält die Längen- und Breitengrade. Um dieses Dokument in Zukunft anhand seines Standorts zu durchsuchen (z. B. das Restaurant in Ihrer Nähe), sollten Sie auch die Felder für Längengrad und Breitengrad indizieren.
Lucene verfügt jetzt über eine sehr leistungsstarke Indexierungs- und Suchfunktion für Geodaten NCache Außerdem können Sie mit der Lucene-API Dokumente indizieren und anschließend nach ihrem Speicherort durchsuchen. Der folgende Link hilft Ihnen zu verstehen, wie Sie Daten indizieren und durchsuchen Verteilte Lucene Geo-Spatial-API .
Verteiltes Lucene-Verhalten in einem Teilcluster
Ein Cache-Cluster wird als teilweise deklariert, wenn einer oder mehrere Knoten darin nicht mehr verfügbar sind. Daher ist die Konnektivität begrenzt, sodass der Cache-Cluster ein Teilcluster ist. Das Verhalten von Distributed Lucene in einem Teilcluster wird im Folgenden erläutert:
Lesevorgänge für einen Teilcluster
NCache Mit Distributed Lucene können Sie Daten aus einem Teilcluster abrufen (lesen), indem Sie den Wert festlegen AllowPartialResults
Eigentum zu TRUE
auf die IndexReader
Klasseninstanz. Standardmäßig ist der Wert von AllowPartialResults
Flag ist auf gesetzt FALSE
.
Diese Lesevorgänge geben teilweise oder unvollständige Daten zurück. Allerdings im Fall von Partition-Replikat-Topologie, toleriert der Cache-Cluster den Ausfall eines einzelnen Knotens über sein Replikat und Sie können vollständige Daten abrufen. Bei Ausfällen mehrerer Knoten können Sie jedoch nur Teildaten abrufen.
Warnung
Wenn Sie versuchen, Daten aus einem Teilcluster zu lesen, und Sie den Wert festgelegt haben AllowPartialResults
Flagge zu FALSE
, wird eine Ausnahme ausgelöst.
Schreiboperationen für einen Teilcluster
Mit Distributed Lucene können Sie keine Schreibvorgänge wie „Hinzufügen“, „Aktualisieren“ und „Löschen“ für einen Teilcluster ausführen. Wenn Sie versuchen, diese Vorgänge für einen Teilcluster auszuführen, wird eine Ausnahme ausgelöst.
Nicht unterstützte Lucene-API
Nachfolgend finden Sie eine Liste der Lucene-APIs, die in Distributed Lucene nicht unterstützt werden.
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
Weitere Informationen
NCache stellt eine Beispielanwendung für Distributed Lucene bereit GitHub.
Siehe auch
Lucene-Komponenten und Übersicht
Konfigurieren Sie Lucene-Abfrageindizes
SQL-Suche im Cache
Durchsuchen Sie den Cache mit LINQ