Maison > Article > développement back-end > Comment utiliser ES en C#
Introduction à Elasticsearch
Elasticsearch (ES) est un moteur de recherche open source basé sur Lucene. Il est non seulement stable, fiable et rapide, mais possède également une bonne évolutivité horizontale. environnements.
Qu'est-ce qu'Elasticsearch
Elasticsearch est un moteur de recherche open source basé sur Apache Lucene(TM) Que ce soit dans les domaines open source ou propriétaire, Lucene peut être considéré comme le plus avancé et le plus performant. à ce jour, la bibliothèque de moteurs de recherche la plus complète.
Cependant, Lucene n'est qu'une bibliothèque. Pour profiter de sa puissance, vous devez l'intégrer dans votre application en C#. Lucene est très complexe et vous avez besoin d'une compréhension approfondie de la récupération pour comprendre son fonctionnement.
Elasticsearch est également écrit en Java et utilise Lucene pour créer des index et implémenter des fonctions de recherche, mais son objectif est de simplifier la recherche en texte intégral et de masquer la complexité de Lucene grâce à une API RESTful simple et cohérente.
Cependant, Elasticsearch est bien plus que Lucene et un moteur de recherche en texte intégral, il fournit également :
Stockage de fichiers distribué en temps réel, chaque champ est indexé et consultable
Réel- analyse temporelle Le moteur de recherche distribué
peut s'adapter à des centaines de serveurs et gérer des pétaoctets de données structurées ou non structurées
De plus, toutes ces fonctions sont intégrées dans un seul serveur, vos applications peuvent interagir avec lui via une simple API RESTful, des clients dans différentes langues et même la ligne de commande. Démarrer avec Elasticsearch est simple, fournit de nombreux paramètres par défaut judicieux et cache la théorie complexe des moteurs de recherche aux débutants. Il fonctionne immédiatement (installé et prêt à l'emploi) et nécessite un apprentissage minimal pour être utilisé dans un environnement de production. Elasticsearch est sous licence Apache 2 et peut être téléchargé, utilisé et modifié gratuitement.
Au fur et à mesure que vous accumulez des connaissances, vous pouvez personnaliser les fonctionnalités avancées d'Elasticsearch en fonction de différents domaines problématiques. Tout cela est configurable et la configuration est très flexible.
Utilisez C# pour faire fonctionner ES
NEST est un client de haut niveau qui peut mapper tous les objets de requête et de réponse, possède une requête DSL (langage spécifique au domaine) fortement typée et peut utiliser .net Des fonctionnalités telles que la covariance et le mappage automatique des POCO, NEST utilise toujours le client Elasticsearch.Net en interne. Le client elasticsearch.net (NEST) fournit une requête DSL fortement typée, pratique à utiliser pour les utilisateurs. Le code source peut être téléchargé.
1. Comment installer NEST
Ouvrez le menu outils de VS, via la console du gestionnaire de packages NuGet, entrez la commande suivante pour installer NEST
Install-Package NEST
Les trois DLL suivantes sont référencées après l'installation
Elasticsearch.Net.dll (2.4.4) Nest.dll (2.4.4) Newtonsoft.Json.dll (version 9.0)
2. Lien vers elasticsearch
Vous pouvez utiliser un pool de connexions pour vous connecter au cluster Elasticsearch via un seul nœud ou spécifier plusieurs nœuds. L'utilisation d'un pool de connexions présente plus d'avantages que la connexion d'un seul nœud. nœud unique vers Elasticsearch, comme la prise en charge de l'équilibrage de charge, du basculement, etc.
Par lien unique :
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
Lien via le pool de connexions :
var nodes = new Uri[]
{
new Uri("http ://monserveur1:9200"),
nouvel Uri("http://monserveur2:9200"),
nouveau Uri("http://monserveur3:9200")
};
var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool);
var client = new ElasticClient(settings);
NEST Index
Afin de savoir sur quel index la requête doit fonctionner, l'API Elasticsearch s'attend à recevoir un ou plusieurs noms d'index dans le cadre de la demande.
1. Spécifiez l'index
1 Vous pouvez utiliser .DefaultIndex() via ConnectionSettings pour spécifier l'index par défaut. Lorsqu'aucun index spécifique n'est spécifié dans une requête, NEST demandera l'index par défaut.
var settings = new ConnectionSettings()
.DefaultIndex("defaultindex");
2 Vous pouvez utiliser .MapDefaultTypeIndices() via ConnectionSettings pour spécifier les index mappés aux types CLR.
var settings = new ConnectionSettings()
.MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects")
);
Remarque : La spécification d'index via .MapDefaultTypeIndices() a une priorité plus élevée que la spécification d'index via .DefaultIndex() et est plus adaptée aux objets simples (POCO)
3. De plus, vous pouvez également spécifier explicitement le nom d'index de la requête, par exemple :
var réponse = client.Index(student, s=>s.Index("db_test") );
var result = client.Search
var result = client.Delete
Remarque : lors de la spécification d'un nom d'index pour une requête, cette priorité est la plus élevée, supérieure à l'index spécifié des deux manières ci-dessus.
4. Certaines API Elasticsearch (telles que la requête) peuvent utiliser un ou plusieurs noms d'index ou utiliser l'indicateur spécial _all pour envoyer des requêtes à plusieurs ou à tous les nœuds sur NEST
//Request Single node
var singleString = Nest.Indices.Index("db_studnet");
var singleTyped = Nest.Indices.Index
ISearchRequest singleStringRequest = new SearchDescriptor
ISearchRequest singleTypedRequest = new SearchDescriptor
//Demander plusieurs nœuds
var manyStrings = Nest.Indices.Index("db_studnet", "db_other_student");
var manyTypes = Nest .Indices. Index
ISearchRequest manyStringRequest = new SearchDescriptor
ISearchRequest manyTypedRequest = new SearchDescriptor
//Demander tous les nœuds
var indicesAll = Nest .Indices. Tous;
var allIndices = Nest.Indices.AllIndices;
ISearchRequest indicesAllRequest = new SearchDescriptor
ISearchRequest allIndicesRequest = new SearchDescriptor
2. Créer un index
API Elasticsearch Vous permet de configurez l'index lors de la création de l'index, par exemple :
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1) );
client.CreateIndex(descriptor);
Ceci précise que le nombre de fragments de l'index est de 5 et le nombre de copies est de 1.
3. Supprimer l'index
L'API Elasticsearch vous permet de supprimer l'index, par exemple :
var descriptor = new DeleteIndexDescriptor("db_student").Index("db_student") ;
client.DeleteIndex(descriptor)
Le nom d'index "db_student" à supprimer est spécifié ici. Voici d'autres cas d'utilisation de suppression :
/. /Supprimer l'index spécifié Tous les index sous le nœud
var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();
NEST Mapping
NEST fournit une variété de méthodes de mappage, qui sont présentés ici. Mappage personnalisé d’attributs.
1. Mise en œuvre simple
1. Définir le POCO requis par l'entreprise et spécifier l'attribut requis
[ElasticsearchType(Name = "student")]
étudiant de classe publique
{
[Nest.String(Index = FieldIndexOption.NotAnalyzed)]
public string Id { get set; >
[Nest.String(Analyzer = "standard")]
chaîne publique Nom { get; 🎜 > [Nest.String(Analyzer = "standard")]
public string Description { get; set; set ; >
}
.Mappings(ms => ms
.Map
);
client.CreateIndex(descriptor);Remarque : il peut être remplacé via .Properties () Mappage défini par Attribute 2. Introduction à Attribute1 StringAttribute3. BooleanAttribute
4. DateAttribute 5. >NEST Search
NEST prend en charge les requêtes en chaîne Lambda DLS (langage spécifique au domaine). Ce qui suit est une implémentation simple et une brève description de chaque requête.
1. Implémentation simple
1. Définir SearchDescriptor pour faciliter la mise en œuvre d'activités complexes dans le projet
var query = new Nest.SearchDescriptor
var result = client.Search
2. Récupérer les documents dont le titre et le contenu contiennent la clé, et dont l'auteur n'est pas égal à "Pretty Girl"
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 )). Requête("wenli")) ) )); Remarque : Si Elasticsearch utilise la segmentation de mots par défaut et que les attributs de titre et de contenu sont [Nest.String(Analyzer = "standard")]Si Elasticsearch utilise la segmentation de mots IK, les attributs de titre et de contenu sont [Nest.String(Analyzer = "ikmaxword")] ou [Nest.String(Analyzer = "ik_smart")]L'attribut de l'auteur est [Nest.String(Index = FieldIndexOption.NotAnalyzed)], et l'utilisation d'analyseur
3. Filtrer les documents dont l'auteur est égal à "Historical River"
query.PostFilter(x => x.Term(t => t.Field(obj => obj.Author).Value(" wenli")));
4. Filtrer les documents dont l'auteur est égal à "Historical River" ou égal à "Friendship Boat", et faire correspondre plusieurs. auteurs séparés par des espaces
query .PostFilter(x => x.QueryString(t => t.Fields(f => f.Field(obj => obj.Author)).Query("wenli yswenli" )));
5. Filtrer les documents avec un nombre compris entre 1 et 100
query.PostFilter(x => x.Range(t => t.Field( obj => obj. Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));
6. query.Sort(x = > query.Highlight(h => h
.PreTags("")
.PostTags("")
f => f.Field(obj => obj.Title),
f => f.Field(obj => obj.Content),
f => f.Field("_all")
)
);
8. , organiser les données et faciliter l'appel précédent
var list = result.Hits.Select(c => new Models.ESObject() { Id = c.Source .Id, Title = c.Highlights == null ? .Join("", c.Highlights["title "].Highlights): c.Source.Title, //Le contenu mis en surbrillance apparaît plusieurs fois dans un enregistrement
Content = c.Highlights == null ? c.Source.Content : c. Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c.Source.Content, //Le contenu mis en surbrillance, combien de fois apparaissent dans un enregistrement Times
Author = c.Source.Author,
Number = c.Source.Number,
IsDisplay = c.Source.IsDisplay,
Tags = c.Source.Tags,
Comments = c.Source.Comments,
DateTime = c.Source.DateTime,
})
2. Introduction à la requête DSL
À régler...
Document elasticsearch.netDocument les opérations comprennent l'ajout/la mise à jour de documents et la mise à jour partielle de documents, la suppression de documents et les méthodes de documents d'opération par lots correspondantes. 1. Ajouter/mettre à jour des documents et des opérations par lotsAjouter/mettre à jour un seul documentClient.Index(student);var list = new List
2. Mise à jour partielle d'un document unique et opération par lots
Mettre à jour partiellement un seul document
client.Update
Mettre à jour partiellement les documents par lots
var ids = new List
var vracQuest = new BulkRequest() { Operations = new List
foreach (var v dans les identifiants)
{
var opération = nouveau BulkUpdateOperation(v);
opération.Doc = nouveau { Nom = "wenli" };
bulkQuest.Operations.Add(opération);
}
var result = client.Bulk(bulkQuest );
3. Suppression de documents et opérations par lots
Suppression d'un seul document
client.Delete
Suppression par lots de documents
var ids = new List
var BulkQuest = new BulkRequest() { Operations = new List
foreach (var v dans les identifiants)
{
bulkQuest.Operations.Add(new BulkDeleteOperation
}
var résultat = client.Bulk (bulkQuest);
Pour plus d'articles sur l'utilisation d'ES en C#, veuillez faire attention au site Web PHP chinois !