Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie ES in C#

So verwenden Sie ES in C#

高洛峰
高洛峰Original
2017-02-08 13:32:012201Durchsuche

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(s => s.Index("db_test"));
var result = client.Delete(null, s => s. Index("db_test" ));

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().Index(singleString);

ISearchRequest singleTypedRequest = new SearchDescriptor().Index(singleTyped);


//Mehrere Knoten anfordern

var ManyStrings = Nest.Indices.Index("db_studnet", "db_other_student");

var ManyTypes = Nest .Indices. Index().And();


ISearchRequest ManyStringRequest = new SearchDescriptor().Index(manyStrings);

ISearchRequest manyTypedRequest = new SearchDescriptor().Index(manyTypes);


//Alle Knoten anfordern

var indicesAll = Nest .Indices. All;

var allIndices = Nest.Indices.AllIndices;


ISearchRequest indicesAllRequest = new SearchDescriptor().Index(indicesAll) ;

ISearchRequest allIndicesRequest = new SearchDescriptor().Index(allIndices);


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

var descriptor = new CreateIndexDescriptor("db_student")

. Settings(s => s.NumberOfShards(5).NumberOfReplicas(1))

.Mappings(ms => ms

.Map(m => m . AutoMap())

);

client.CreateIndex(descriptor);

Hinweis: Es kann über .Properties überschrieben werden () Zuordnung definiert durch Attribut

2. Einführung in Attribut

1. NumberAttribute

3. BooleanAttribute

4. DateAttribute

So verwenden Sie ES in C#

5. ObjectAttribute

So verwenden Sie ES in C#

NEST-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(x => query)

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“ ist

query.PostFilter(x => x.Term(t => t.Field(obj => obj.Author).Value(" wenli")));


4. Filtern Sie Dokumente, deren Autor gleich „Historical River“ oder gleich „Friendship Boat“ ist, und stimmen Sie mit mehreren überein Autoren durch Leerzeichen getrennt

query .PostFilter(x => x.QueryString(t => t.Fields(f =>


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( "")

.PostTags("")


.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-Dokument

Dokumentvorgä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/aktualisieren

Einzelnes Dokument hinzufügen/aktualisieren


Client.Index(student);

Batch Dokumentation hinzufügen/aktualisieren

var list = new List();2 3 client.IndexMany(list);

2. Teilweise Aktualisierung des Einzeldokument- und Stapelvorgangs

Ein einzelnes Dokument teilweise aktualisieren

client.Update("002", upt => upt.Doc(new { Name = "wenli" }));

Batchdokumente teilweise aktualisieren

var ids = new List() { "002" };


var bulkQuest = new BulkRequest() { Operations = new List() };


foreach (var v in ids)

{

var operation = new BulkUpdateOperation(v);


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("001" );

Batch-Löschen von Dokumenten

var ids = new List() { "001", "002" };


var bulkQuest = new BulkRequest() { Operations = new List() };


foreach (var v in ids)

{

bulkQuest.Operations.Add(new BulkDeleteOperation(v));

}


var result = client.Bulk (bulkQuest);

Weitere Artikel zur Verwendung von ES in C# finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C#-Namespace (Namespace)Nächster Artikel:C#-Namespace (Namespace)