Einführung in Elasticsearch
Elasticsearch (ES) ist eine auf Lucene basierende Open-Source-Suchmaschine, die nicht nur stabil, zuverlässig und schnell ist, sondern auch eine gute horizontale Skalierbarkeit aufweist .
Was ist Elasticsearch?
Elasticsearch ist eine Open-Source-Suchmaschine, die auf Apache Lucene(TM) basiert. Ob im Open-Source- oder proprietären Bereich, Lucene kann als die fortschrittlichste und leistungsstärkste Suchmaschine angesehen werden , die bisher umfassendste Suchmaschinenbibliothek.
Lucene ist jedoch nur eine Bibliothek. Um seine Leistungsfähigkeit zu nutzen, müssen Sie es mithilfe von C# in Ihre Anwendung integrieren. Lucene ist sehr komplex und Sie benötigen ein tiefes Verständnis des Retrievals, um zu verstehen, wie es funktioniert.
Elasticsearch ist ebenfalls in Java geschrieben und verwendet Lucene, um Indizes zu erstellen und Suchfunktionen zu implementieren. Sein Zweck besteht jedoch darin, die Volltextsuche zu vereinfachen und die Komplexität von Lucene durch eine einfache und kohärente RESTful-API zu verbergen.
Elasticsearch ist jedoch mehr als nur Lucene und Volltextsuchmaschinen, es bietet auch:
Verteilte Dateispeicherung in Echtzeit, jedes Feld ist indiziert und durchsuchbar
Echtzeit Analyse Die verteilte Suchmaschine
kann auf Hunderte von Servern skaliert werden und Petabytes an strukturierten oder unstrukturierten Daten verarbeiten
Darüber hinaus sind alle diese Funktionen in einem Server integriert, Ihre Anwendungen können über einen mit ihm interagieren einfache RESTful-API, Clients in verschiedenen Sprachen und sogar die Befehlszeile. Der Einstieg in Elasticsearch ist einfach, bietet viele sinnvolle Standardeinstellungen und verbirgt komplexe Suchmaschinentheorien vor Anfängern. Es ist sofort einsatzbereit (installiert und einsatzbereit) und erfordert nur minimale Einarbeitung für den Einsatz in einer Produktionsumgebung. Elasticsearch ist unter der Apache 2-Lizenz lizenziert und kann kostenlos heruntergeladen, verwendet und geändert werden.
Mit zunehmendem Wissen können Sie die erweiterten Funktionen von Elasticsearch an verschiedene Problembereiche anpassen. All dies ist konfigurierbar und die Konfiguration ist sehr flexibel.
Verwenden Sie C#, um ES zu betreiben
NEST ist ein High-Level-Client, der alle Anforderungs- und Antwortobjekte abbilden kann, über eine stark typisierte Abfrage-DSL (domänenspezifische Sprache) verfügt und .net verwenden kann Für Funktionen wie Kovarianz und automatische Zuordnung von POCOs verwendet NEST intern weiterhin den Elasticsearch.Net-Client. Der Elasticsearch.net (NEST)-Client bietet zur Benutzerfreundlichkeit eine stark typisierte Abfrage-DSL. Der Quellcode kann heruntergeladen werden.
1. So installieren Sie NEST
Öffnen Sie das Tools-Menü von VS, geben Sie über die NuGet-Paketmanagerkonsole den folgenden Befehl ein, um NEST zu installieren
Install-Package NEST
Die folgenden drei DLLs werden nach der Installation referenziert
Elasticsearch.Net.dll (2.4.4) Nest.dll (2.4.4) Newtonsoft.Json.dll (Version 9.0)
2. Link zu Elasticsearch
Sie können einen Verbindungspool verwenden, um über einen einzelnen Knoten eine Verbindung zum Elasticsearch-Cluster herzustellen, oder die Verwendung eines Verbindungspools hat mehr Vorteile als die Verbindung eines einzelner Knoten zu Elasticsearch, z. B. zur Unterstützung von Lastausgleich, Failover usw.
Durch einzelnen Link:
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
Link durch den Verbindungspool:
var nodes = new Uri[]
{
new Uri("http ://meinserver1:9200"),
neuer Uri("http://meinserver2:9200"),
neuer Uri("http://meinserver3:9200")
};
var pool = new StaticConnectionPool(nodes);
var Settings = new ConnectionSettings(pool);
var client = new ElasticClient(settings);
NEST Index
Um zu wissen, welchen Index die Anfrage bearbeiten muss, erwartet die Elasticsearch-API als Teil einen oder mehrere Indexnamen der Anfrage.
1. Geben Sie den Index an
1. Sie können .DefaultIndex() über ConnectionSettings verwenden, um den Standardindex anzugeben. Wenn in einer Anfrage kein bestimmter Index angegeben ist, fordert NEST den Standardindex an.
var settings = new ConnectionSettings()
.DefaultIndex("defaultindex");
2. Sie können .MapDefaultTypeIndices() über ConnectionSettings verwenden, um Indizes anzugeben, die CLR-Typen zugeordnet sind.
var Settings = new ConnectionSettings()
.MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects")
);
Hinweis: Die Angabe von Indizes über .MapDefaultTypeIndices() hat eine höhere Priorität als die Angabe von Indizes über .DefaultIndex() und eignet sich besser für einfache Objekte (POCO)
3. Darüber hinaus können Sie auch explizit den Indexnamen für die Anfrage angeben, zum Beispiel:
var Response = client.Index(student, s=>s.Index("db_test") );
var result = client.Search
var result = client.Delete
Hinweis: Bei der tatsächlichen Angabe eines Indexnamens für eine Anfrage ist diese Priorität am höchsten und höher als der Index, der auf die beiden oben genannten Arten angegeben wurde.
4. Einige Elasticsearch-APIs (z. B. Abfrage) können einen oder mehrere Indexnamen oder das spezielle Flag _all verwenden, um Anfragen an mehrere oder alle Knoten auf NEST zu senden
//Einzelner Knoten anfordern
var singleString = Nest.Indices.Index("db_studnet");
var singleTyped = Nest.Indices.Index
ISearchRequest singleStringRequest = new SearchDescriptor
ISearchRequest singleTypedRequest = new SearchDescriptor
//Mehrere Knoten anfordern
var ManyStrings = Nest.Indices.Index("db_studnet", "db_other_student");
var ManyTypes = Nest .Indices. Index
ISearchRequest ManyStringRequest = new SearchDescriptor
ISearchRequest manyTypedRequest = new SearchDescriptor
//Alle Knoten anfordern
var indicesAll = Nest .Indices. All;
var allIndices = Nest.Indices.AllIndices;
ISearchRequest indicesAllRequest = new SearchDescriptor
ISearchRequest allIndicesRequest = new SearchDescriptor
2. Index erstellen
Elasticsearch API Ermöglicht es Ihnen Konfigurieren Sie den Index beim Erstellen des Index, zum Beispiel:
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1) );
client.CreateIndex(descriptor);
Dies gibt an, dass die Anzahl der Shards des Index 5 und die Anzahl der Kopien 1 beträgt.
3. Index löschen
Mit der Elasticsearch-API können Sie den Index löschen, zum Beispiel:
var descriptor = new DeleteIndexDescriptor("db_student").Index("db_student") ;
client.DeleteIndex(descriptor)
Der zu löschende Indexname „db_student“ wird hier angegeben. Weitere Löschanwendungsfälle sind:
/ /Löschen Sie den angegebenen Index. Alle Indizes unter dem Knoten
var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();
NEST Mapping
NEST bietet eine Vielzahl von Zuordnungsmethoden. die hier vorgestellt werden.
1. Einfache Implementierung
1. Definieren Sie den vom Unternehmen benötigten POCO und geben Sie das erforderliche Attribut an
[ElasticsearchType(Name = "student")]
public class Student
{
[Nest.String(Index = FieldIndexOption.NotAnalyzed)]
public string Id { get; >
[Nest.String(Analyzer = "standard")]
öffentlicher String Name { get; 🎜 > [Nest.String(Analyzer = "standard")]
public string Beschreibung { get }
public DateTime DateTime { get; set ; }
}
2. Dann verwenden wir .AutoMap(), um die Zuordnung zu implementieren
client.CreateIndex(descriptor);
Hinweis: Es kann über .Properties überschrieben werden () Zuordnung definiert durch Attribut
2. Einführung in Attribut
3. BooleanAttribute
4. DateAttribute5. ObjectAttributeNEST-Suche
NEST bietet Unterstützung für die Lambda-Kettenabfrage DLS (domänenspezifische Sprache). Im Folgenden finden Sie eine einfache Implementierung und eine kurze Beschreibung jeder Abfrage.
1. Einfache Implementierung
1. Definieren Sie SearchDescriptor, um die Implementierung komplexer Geschäfte im Projekt zu erleichtern
var query = new Nest.SearchDescriptor
var result = client.Search
2. Dokumente abrufen, deren Titel und Inhalt den Schlüssel enthalten und deren Autor nicht mit „Pretty Girl“ übereinstimmt
query.Query(q =>
q.Bool(b =>
) b.Must(m =>
MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content)).Query(key))
)
.MustNot(m =>
m.QueryString(t => t.Fields(f => f.Field(obj => obj.Author )). Abfrage("wenli"))
)
)
);
Hinweis:
Wenn Elasticsearch die Standard-Wortsegmentierung verwendet und die Attribute von Titel und Inhalt [Nest.String(Analyzer = "standard")] lauten.
Wenn Elasticsearch die IK-Wortsegmentierung verwendet, lauten die Attribute von Titel und Inhalt [Nest.String(Analyzer = "ikmaxword")] oder [Nest.String(Analyzer = "ik_smart")]
Das Attribut des Autors ist [Nest.String(Index = FieldIndexOption.NotAnalyzed)] und die Verwendung des Analysators
3. Filtern Sie Dokumente, deren Autor gleich „Historical River“ istquery.PostFilter(x => x.Term(t => t.Field(obj => obj.Author).Value(" wenli")));
5. Dokumente mit einer Zahl zwischen 1 und 100 filtern
query.PostFilter(x => x.Range(t => t.Field(obj => obj. Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));
6. Sortieren nach dem Score-Flashback
query.Sort(x = > query.Highlight(h => h
.PreTags( "")
.Fields (
f => f.Field(obj => ; obj.Title),
f => f.Field(obj => obj.Content),
f => f.Field("_all")
)
);
8. Abfrageinhalte zusammenstellen, Daten organisieren und frühere Anrufe erleichtern
var list = result .Hits.Select(c => new Models.ESObject(){ Id = c.Source .Id,
Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights["title "].Highlights): c.Source.Title, //Der hervorgehobene Inhalt erscheint mehrmals in einem Datensatz
Content = c.Highlights == null ? c.Highlights.Keys.Contains("content") ? ["content"].Highlights): c.Source.Content, //Der hervorgehobene Inhalt, wie oft er in einem Datensatz vorkommt. Zeiten
Autor = c.Source.Author,
Nummer = c.Source.Number,
IsDisplay = c.Source.IsDisplay,
Tags = c.Source.Tags,
Kommentare = c.Source.Comments,
DateTime = c.Source.DateTime,
})
2. Einführung in die Abfrage von DSL
Zu klären. ..
Elasticsearch.net-DokumentDokumentvorgänge umfassen das Hinzufügen/Aktualisieren von Dokumenten und das teilweise Aktualisieren von Dokumenten, das Löschen von Dokumenten und entsprechende Stapelverarbeitungsdokumentmethoden. 1. Dokumente und Stapelvorgänge hinzufügen/aktualisierenEinzelnes Dokument hinzufügen/aktualisieren
Client.Index(student);
var list = new List
2. Teilweise Aktualisierung des Einzeldokument- und Stapelvorgangs
Ein einzelnes Dokument teilweise aktualisieren
client.Update
Batchdokumente teilweise aktualisieren
var ids = new List
var bulkQuest = new BulkRequest() { Operations = new List
foreach (var v in ids)
{
var operation = new BulkUpdateOperation
operation.Doc = new { Name = "wenli" };
bulkQuest.Operations.Add(operation);
}
var result = client.Bulk(bulkQuest );
3. Dokumente und Stapelvorgänge löschen
Einzelnes Dokument löschen
client.Delete
Batch-Löschen von Dokumenten
var ids = new List
var bulkQuest = new BulkRequest() { Operations = new List
foreach (var v in ids)
{
bulkQuest.Operations.Add(new BulkDeleteOperation
}
var result = client.Bulk (bulkQuest);
Weitere Artikel zur Verwendung von ES in C# finden Sie auf der chinesischen PHP-Website!