Maison  >  Article  >  développement back-end  >  Comment utiliser ES en C#

Comment utiliser ES en C#

高洛峰
高洛峰original
2017-02-08 13:32:012182parcourir

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

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

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


//Demander plusieurs nœuds

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);


//Demander tous les nœuds

var indicesAll = Nest .Indices. Tous;

var allIndices = Nest.Indices.AllIndices;


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

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


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 ; >

}

2. Ensuite, nous utilisons .AutoMap() pour implémenter le mappage

var descriptor = new CreateIndexDescriptor("db_student")

. Paramètres(s => s.NumberOfShards(5).NumberOfReplicas(1))


.Mappings(ms => ms

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

);

client.CreateIndex(descriptor);

Remarque : il peut être remplacé via .Properties () Mappage défini par Attribute

2. Introduction à Attribute

1 StringAttribute


2.

3. BooleanAttribute

4. DateAttribute

Comment utiliser ES en C#

5. >

Comment utiliser ES en C#

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

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

.Fields (


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

Document 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 lots

Ajouter/mettre à jour un seul document

Client.Index(student);


Lot ajouter/Mettre à jour la documentation

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

2. Mise à jour partielle d'un document unique et opération par lots

Mettre à jour partiellement un seul document

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

Mettre à jour partiellement les documents par lots

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


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

Suppression par lots de documents

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


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


foreach (var v dans les identifiants)

{

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

}


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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn