Maison >interface Web >js tutoriel >Construisez un moteur de recherche avec Node.js et Elasticsearch

Construisez un moteur de recherche avec Node.js et Elasticsearch

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌original
2025-02-17 08:47:09916parcourir

Build a Search Engine with Node.js and Elasticsearch

Cet article a été évalué par des pairs par Mark Brown, Vildan Softic et Moritz Kröger. Merci à tous les pairs examinateurs de SitePoint pour avoir rendu le contenu de SitePoint parfait!

Elasticsearch est un moteur de recherche open source qui devient de plus en plus populaire en raison de ses performances élevées et de son architecture distribuée. Cet article explorera ses caractéristiques clés et vous guidera comment l'utiliser pour créer un moteur de recherche Node.js.

Points clés

  • Elasticsearch est un moteur de recherche distribué haute performance construit sur Apache Lucene, principalement utilisé pour les données d'indexation et de recherche en temps réel.
  • Le système est sans modèle, peut détecter automatiquement les structures et les types de données, et prend en charge un grand nombre d'opérations en utilisant l'API RESTful de JSON sur HTTP.
  • Elasticsearch peut être facilement installé sur le système d'exploitation principal à l'aide d'un gestionnaire de packages tel que des fichiers ZIP ou Homebrew, et nécessite un environnement d'exécution Java pour s'exécuter.
  • Le module officiel Elasticsearch de Node.js facilite l'intégration de la fonctionnalité d'Elasticsearch avec les applications Node.js, permettant une indexation et une interrogation efficaces de données.
  • Les concepts clés d'Elasticsearch incluent l'indexation, les types et les recherches, qui permettent des requêtes, des filtres et des agrégations complexes pour affiner et analyser les données.
  • Elasticsearch prend en charge la recherche en temps réel, ce qui signifie que les données nouvellement indexées peuvent être recherchées presque immédiatement, améliorant ainsi la vitesse de réponse des applications qui reposent sur les dernières informations.
  • Ce didacticiel fournit des exemples pratiques et des extraits de code sur la configuration d'Elasticsearch avec Node.js, la réalisation de divers types de recherches et l'utilisation de fonctionnalités avancées telles que l'agrégation de données et les suggestions.

Introduction à Elasticsearch

Elasticsearch est construit au-dessus d'Apache Lucene, une bibliothèque de moteurs de recherche de texte haute performance. Bien que Elasticsearch puisse effectuer le stockage et la récupération des données, son objectif principal n'est pas d'agir comme une base de données, mais un moteur de recherche (serveur), dont l'objectif principal est d'indexer, de rechercher et de fournir des statistiques en temps réel des données.

Elasticsearch a une architecture distribuée qui peut atteindre une mise à l'échelle horizontale en ajoutant plus de nœuds et en tirant parti du matériel supplémentaire. Il prend en charge des milliers de nœuds pour traiter les pétaoctets de données. Sa mise à l'échelle horizontale signifie également qu'elle a une haute disponibilité et peut rééquilibrer les données en cas d'échec du nœud.

Après l'importation des données, il sera utilisé immédiatement pour la recherche. Elasticsearch est sans schéma, stocke les données dans les documents JSON et peut détecter automatiquement les structures et les types de données.

Elasticsearch est également complètement alimenté par API. Cela signifie que presque toutes les opérations peuvent être effectuées via une API RESTful simple utilisant des données JSON sur HTTP. Il fournit de nombreuses bibliothèques clients pour presque tous les langues de programmation, y compris Node.js. Dans ce tutoriel, nous utiliserons la bibliothèque client officielle.

Elasticsearch est très flexible en termes de matériel et de logiciels. Bien que l'environnement de production recommandé soit 64 Go de RAM et autant de cœurs CPU que possible, vous pouvez toujours l'exécuter sur un système limité aux ressources et obtenir des performances décentes (en supposant que votre ensemble de données n'est pas très important). Pour suivre les exemples de cet article, un système avec 2 Go de mémoire et un seul noyau CPU suffit.

Vous pouvez exécuter Elasticsearch sur tous les principaux systèmes d'exploitation (Linux, Mac OS et Windows). Pour ce faire, vous devez installer la dernière version de l'environnement d'exécution Java (voir la section "Installer Elasticsearch"). Pour suivre les exemples de cet article, vous devez également installer Node.js (toute version après la v0.11.0 fera l'affaire), ainsi que NPM.

Terminologie Elasticsearch

Elasticsearch utilise sa propre terminologie, qui est différente dans certains cas d'un système de base de données typique. Voici une liste de termes couramment utilisés et de leur signification dans Elasticsearch.

Index: Ce terme a deux significations dans le contexte d'Elasticsearch. Le premier est le fonctionnement de l'ajout de données. Lorsque des données sont ajoutées, le texte est divisé en balises (telles que les mots) et chaque balise est indexée. Cependant, les index se réfèrent également à l'emplacement où toutes les données d'index sont stockées. Fondamentalement, lorsque vous importez les données, il est indexé dans un index. Chaque fois que vous souhaitez effectuer quoi que ce soit sur vos données, vous devez spécifier son nom d'index.

Type: elasticsearch fournit une classification plus détaillée des documents dans l'index, appelées types. Chaque document de l'index doit également avoir un type. Par exemple, nous pouvons définir un index de bibliothèque, puis informer plusieurs types de données (tels que des articles, des livres, des rapports et des présentations). Étant donné que les index ont presque corrigé les frais généraux, il est recommandé d'utiliser moins d'index et plus de types au lieu de plus d'index et de moins de types.

Recherche: Ce terme peut signifier la même chose que vous le pensez. Vous pouvez rechercher des données dans différents index et types. Elasticsearch fournit de nombreux types de requêtes de recherche, telles que des termes, des phrases, des gammes, des requêtes de données floues et même géographiques.

Filtre: Elasticsearch vous permet de filtrer les résultats de recherche en fonction de différents critères pour réduire davantage la plage de résultats. Si vous ajoutez une nouvelle requête de recherche à un ensemble de documents, il peut modifier l'ordre en fonction de la dépendance, mais si vous ajoutez la même requête qu'un filtre, l'ordre reste le même.

AGLÉGATION: Celles-ci fournissent différents types de statistiques pour les données agrégées, telles que le minimum, le maximum, la moyenne, la somme, l'histogramme, etc.

Suggestions: elasticsearch fournit différents types de suggestions pour le texte d'entrée. Ces suggestions peuvent être basées sur des termes ou des phrases, et même des suggestions peuvent être terminées.

Installer Elasticsearch

Elasticsearch est disponible sous la licence Apache 2; il peut être téléchargé, utilisé et modifié gratuitement. Avant de l'installer, vous devez vous assurer que l'environnement d'exécution Java (JRE) est installé sur votre ordinateur. Elasticsearch est écrit en Java et dépend des bibliothèques Java à exécuter. Pour vérifier si Java est installé sur votre système, vous pouvez taper ce qui suit dans la ligne de commande.

<code>java -version</code>

La dernière version stable de Java est recommandée (1.8 au moment de la rédaction). Vous pouvez trouver un guide sur l'installation de Java sur votre système ici.

Ensuite, pour télécharger la dernière version d'Elasticsearch (2.4.0 au moment de la rédaction), visitez la page de téléchargement et téléchargez le fichier zip. Elasticsearch ne nécessite pas d'installation et un seul fichier ZIP contient un ensemble complet de fichiers qui exécutent des programmes sur tous les systèmes d'exploitation pris en charge. Décompressez le fichier téléchargé et c'est fait! Il existe plusieurs autres façons d'exécuter Elasticsearch, comme obtenir des fichiers ou des packages TAR pour différentes distributions Linux (voir ici).

Si vous exécutez Mac OS X et que Homebrew Homebrew, vous pouvez utiliser Brew Installer Elasticsearch pour installer Elasticsearch. Homebrew ajoutera automatiquement l'exécutable à votre chemin et installera les services requis. Il vous aide également à mettre à jour votre application avec une seule commande: Brew Mise à niveau Elasticsearch.

Pour exécuter Elasticsearch sur Windows, exécutez BinelasticSearch.bat à partir du répertoire décompressé. Pour tous les autres systèmes d'exploitation, exécutez ./bin/elasticsearch à partir du terminal. À ce stade, il devrait fonctionner sur votre système.

Comme je l'ai mentionné plus tôt, presque tout ce que vous pouvez faire avec Elasticsearch peut être fait via l'API REST. Elasticsearch utilise le port 9200 par défaut. Pour vous assurer de l'exécuter correctement, visitez http: // localhost: 9200 / dans votre navigateur, qui devrait afficher des informations de base sur l'instance que vous exécutez.

Pour plus d'informations sur l'installation et le dépannage, vous pouvez accéder à la documentation.

Interface utilisateur graphique

Elasticsearch fournit presque toutes les fonctionnalités via l'API REST et ne vient pas avec une interface utilisateur graphique (GUI). Bien que j'aie couvert comment effectuer toutes les opérations nécessaires via l'API et Node.js, il existe des outils d'interface graphique qui fournissent des informations visuelles sur les index et les données, et même quelques analyses avancées.

Kibana, développé par la même entreprise, fournit un résumé en temps réel des données, ainsi que certaines options de visualisation et d'analyse personnalisées. Kibana est gratuite et a une documentation détaillée.

La communauté a également développé d'autres outils, notamment Elasticsearch-Head, The Elasticsearch GUI et même une extension chromée appelée Elasticsearch Toolbox. Ces outils peuvent vous aider à parcourir les index et les données de votre navigateur, et même essayer différentes recherches et requêtes agrégées. Tous ces outils fournissent des procédures pas à pas pour l'installation et l'utilisation.

Set Node.js Environnement

Elasticsearch fournit un module officiel pour Node.js appelé elasticsearch. Tout d'abord, vous devez ajouter le module à votre dossier de projet et enregistrer les dépendances pour une utilisation future.

<code>npm install elasticsearch --save</code>

Vous pouvez ensuite importer le module dans le script comme suit:

<code>java -version</code>

Enfin, vous devez configurer un client qui gère la communication avec Elasticsearch. Dans cet exemple, je suppose que vous exécutez Elasticsearch sur votre machine locale avec une adresse IP de 127.0.0.1 et un port de 9200 (paramètre par défaut).

<code>npm install elasticsearch --save</code>
L'option

Log garantit que toutes les erreurs sont enregistrées. Pour le reste de cet article, j'utiliserai le même objet Esclient pour communiquer avec Elasticsearch. La documentation complète du module de nœud est fournie ici.

Remarque: Tout le code source de ce tutoriel est disponible sur GitHub. La façon la plus simple de suivre est de cloner le référentiel de votre PC et d'exécuter l'exemple à partir de là:

<code>const elasticsearch = require('elasticsearch');</code>

Importer des données

Dans ce tutoriel, j'utiliserai un ensemble de données d'articles académiques avec du contenu généré de manière aléatoire. Les données sont fournies au format JSON, et il y a 1 000 articles dans l'ensemble de données. Pour afficher le style des données, un élément de l'ensemble de données est illustré ci-dessous.

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

Le nom du champ est explicite. La seule chose à noter est que le champ corporel n'est pas illustré ici, car il contient un document complet généré au hasard (y compris 100 à 200 paragraphes). Vous pouvez trouver l'ensemble de données complet ici.

Bien qu'ElasticSearch fournit des méthodes d'indexation, de mise à jour et de supprimer des points de données individuels, nous utiliserons la méthode par lots d'ElasticSerch pour importer des données, qui est utilisée pour effectuer des opérations sur de grands ensembles de données plus efficacement:

<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>

Ici, nous appelons la fonction BulkIndex, passant la bibliothèque comme nom d'index, article comme type et les données JSON que nous voulons indexer. La fonction BulkIndex appelle la méthode en vrac sur l'objet Esclient à son tour. Cette méthode prend un objet avec l'attribut corporel en tant que paramètre. La valeur fournie à la propriété corporelle est un tableau avec deux entrées par opération. Dans la première entrée, le type d'opération est spécifié comme un objet JSON. Dans cet objet, la propriété d'index détermine l'opération à effectuer (dans ce cas le document d'index), ainsi que le nom d'index, le nom de type et l'ID du document. L'entrée suivante correspond au document lui-même.

Veuillez noter qu'à l'avenir, vous pouvez ajouter d'autres types de documents (tels que des livres ou des rapports) au même index de cette manière. Nous pouvons également attribuer un ID unique à chaque document, mais cela est facultatif - si vous n'en fournissez pas, Elasticsearch vous attribuera un ID généré au hasard unique à chaque document.

En supposant que vous avez cloné le référentiel, vous pouvez désormais importer les données dans Elasticsearch en exécutant la commande suivante à partir de la racine du projet:

<code>{
    "_id": "57508457f482c3a68c0a8ab3",
    "title": "Nostrud anim proident cillum non.",
    "journal": "qui ea",
    "volume": 54,
    "number": 11,
    "pages": "109-117",
    "year": 2014,
    "authors": [
      {
        "firstname": "Allyson",
        "lastname": "Ellison",
        "institution": "Ronbert",
        "email": "Allyson@Ronbert.tv"
      },
      ...
    ],
    "abstract": "Do occaecat reprehenderit dolore ...",
    "link": "http://mollit.us/57508457f482c3a68c0a8ab3.pdf",
    "keywords": [
      "sunt",
      "fugiat",
      ...
    ],
    "body": "removed to save space"
  }</code>

Vérifiez si les données sont correctement indexées

Une caractéristique majeure d'Elasticsearch est sa recherche à temps quasi réel. Cela signifie qu'une fois les documents indexés, ils sont disponibles pour la recherche dans une seconde (voir ici). Une fois les données indexées, vous pouvez vérifier les informations d'index en exécutant Indices.js (liées au code source):

<code class="language-javascript">// index.js

const bulkIndex = function bulkIndex(index, type, data) {
  let bulkBody = [];

  data.forEach(item => {
    bulkBody.push({
      index: {
        _index: index,
        _type: type,
        _id: item.id
      }
    });

    bulkBody.push(item);
  });

  esClient.bulk({body: bulkBody})
  .then(response => {
    console.log('here');
    let errorCount = 0;
    response.items.forEach(item => {
      if (item.index && item.index.error) {
        console.log(++errorCount, item.index.error);
      }
    });
    console.log(
      `Successfully indexed ${data.length - errorCount}
       out of ${data.length} items`
    );
  })
  .catch(console.err);
};

const test = function test() {
  const articlesRaw = fs.readFileSync('data.json');
  bulkIndex('library', 'article', articles);
};</code>

La méthode de l'objet CAT du client fournit des informations différentes sur l'instance en cours d'exécution. La méthode des indices répertorie tous les index, leur santé, le nombre de documents et leur taille sur le disque. L'option V ajoute un titre à la réponse de la méthode CAT.

Lorsque vous exécutez l'extrait de code ci-dessus, vous remarquerez qu'il publie un code couleur pour indiquer la santé du cluster. Le rouge indique qu'il y a un problème avec le cluster et qu'il ne fonctionne pas. Le jaune indique que le cluster est en cours d'exécution, mais il y a un avertissement, et le vert indique que tout va bien. Très probablement (selon vos paramètres), vous obtenez un état jaune lors de l'exécution de votre machine locale. En effet, les paramètres par défaut contiennent cinq nœuds du cluster, mais une seule instance s'exécute sur votre machine locale. Bien que vous deviez toujours vous efforcer d'un état vert en production, aux fins de ce tutoriel, vous pouvez continuer à utiliser Elasticsearch à l'état jaune.

<code>java -version</code>

mappage dynamique et personnalisé

Comme je l'ai mentionné plus tôt, Elasticsearch est sans motif. Cela signifie que vous n'avez pas à définir la structure des données avant de les importer (similaire à la définition d'une table dans une base de données SQL), mais Elasticsearch le détectera automatiquement pour vous. Cependant, bien qu'ils soient appelés schémas, les structures de données ont certaines limites.

Elasticsearch appelle la structure des données une cartographie. Si aucun mappage n'existe, Elasticsearch examine chaque champ des données JSON lors de l'indexation des données et définit automatiquement le mappage en fonction de son type. Si le champ a déjà une entrée de mappage, il garantit que les nouvelles données ajoutées suit le même format. Sinon, il lancera une erreur.

Par exemple, si {"key1": 12} a été indexé, Elasticsearch mappera automatiquement le champ Key1 à long. Maintenant, si vous essayez d'indexer {"Key1": "Value1", "Key2": "Value2"}, il lance une erreur car il s'attend à ce que le type de champ Key1 soit long. En attendant, l'objet {"key1": 13, "key2": "value2"} sera indexé sans problèmes et KEY2 de la chaîne de type sera ajouté à la carte.

La carte dépasse le cadre de cet article, et dans la plupart des cas, la cartographie automatique fonctionne bien. Je recommande de consulter la documentation Elasticsearch, qui fournit une discussion approfondie des mappages.

Créez un moteur de recherche

Une fois les données indexées, nous pouvons implémenter les moteurs de recherche. Elasticsearch fournit une structure de requête de recherche en texte intégral intuitif appelé requête dsl - il est basé sur JSON - pour définir les requêtes. Il existe de nombreux types de requêtes de recherche disponibles, mais dans cet article, nous examinerons plusieurs des questions les plus courantes. La documentation complète de Query DSL peut être trouvée ici.

Rappelez-vous, j'ai fourni un lien de code pour chaque exemple indiqué ici. Une fois l'environnement configuré et les données de test indexées, vous pouvez cloner le référentiel et exécuter tous les exemples sur votre machine. Pour ce faire, exécutez simplement Node FileName.js à partir de la ligne de commande.

Renvoie tous les documents dans un ou plusieurs index

Pour effectuer une recherche, nous utiliserons diverses méthodes de recherche fournies par le client. La requête la plus simple est Match_all, qui renvoie tous les documents dans un ou plusieurs index. L'exemple suivant montre comment nous obtenons tous les documents stockés dans l'index (lien vers le code source).

<code>java -version</code>

La requête de recherche principale est contenue dans l'objet de requête. Comme nous le verrons plus loin, nous pouvons ajouter différents types de requêtes de recherche à cet objet. Pour chaque requête, nous ajoutons une clé qui contient le type de requête (match_all dans cet exemple) avec la valeur de l'objet contenant les options de recherche. Il n'y a pas d'option dans cet exemple car nous voulons renvoyer tous les documents dans l'index.

En plus de l'objet de requête, le corps de recherche peut également contenir d'autres propriétés facultatives, y compris la taille et à partir de. L'attribut de taille détermine le nombre de documents à inclure dans la réponse. Si cette valeur n'existe pas, dix documents sont renvoyés par défaut. La propriété de la propriété détermine l'indice de départ du document retourné. Ceci est utile pour la pagination.

Comprendre la réponse de l'API de recherche

Si vous enregistrez la réponse de l'API de recherche (entraîne l'exemple ci-dessus), il peut initialement sembler compliqué car il contient beaucoup d'informations.

<code>npm install elasticsearch --save</code>

Au plus haut niveau, la réponse comprend un attribut de prise qui représente le nombre de millisecondes qu'il a fallu pour trouver le résultat, timed_out, qui n'est vrai que si le résultat n'est pas trouvé dans le temps maximum autorisé, _shards, qui est utilisé Pour fournir des informations pertinentes sur l'état (si elle est déployée en tant que cluster de nœuds), et frappe, qui contiennent des résultats de recherche.

Dans la propriété Hits, nous avons un objet avec les propriétés suivantes:

  • total - indique le nombre total de correspondances
  • max_score - le score le plus élevé pour l'élément trouvé
  • Hits - Un tableau contenant les éléments trouvés. Dans chaque document du tableau Hits, nous avons l'index, le type, l'ID de document, le score et le document lui-même (dans l'élément _Source).

C'est très complexe, mais la bonne nouvelle est qu'une fois que vous avez mis en œuvre un moyen d'extraire les résultats, vous obtiendrez toujours les résultats dans le même format quelle que soit votre requête de recherche.

Notez également que l'un des avantages d'Elasticsearch est qu'il attribue automatiquement un score à chaque document de correspondance. Ce score est utilisé pour quantifier la pertinence du document, et par défaut, les résultats sont renvoyés par ordre de scores décroissants. Dans le cas où nous utilisons Match_all pour récupérer tous les documents, les scores n'ont aucun sens et tous les scores sont calculés comme 1.0.

Le document avec une valeur spécifique dans le champ de correspondance

Maintenant, regardons quelques exemples plus intéressants. Pour faire correspondre des documents contenant des valeurs spécifiques dans le domaine, nous pouvons utiliser la requête de correspondance. Vous trouverez ci-dessous un corps de recherche simple avec une requête de correspondance (lien vers le code source).

<code>const elasticsearch = require('elasticsearch');</code>

Comme je l'ai mentionné plus tôt, nous ajoutons d'abord une entrée à un objet de requête qui contient le type de recherche, correspondant à cet exemple. Dans l'objet de type de recherche, nous identifions le champ de document à rechercher, voici le titre. Dans ce document, nous mettons des données liées à la recherche, y compris l'attribut de requête. J'espère qu'après avoir testé l'exemple ci-dessus, vous commencerez à être étonné de la vitesse de recherche.

La requête de recherche ci-dessus renvoie un document dont le champ de titre correspond à n'importe quel mot dans l'attribut de requête. Nous pouvons définir le nombre minimum de correspondances comme indiqué ci-dessous.

<code>java -version</code>

Cette requête correspond aux documents avec au moins trois mots spécifiés dans son titre. S'il y a moins de trois mots dans la requête, tous les mots doivent apparaître dans le titre pour correspondre au document. Une autre fonctionnalité utile ajoutée aux requêtes de recherche est l'ambiguïté. Ceci est utile si l'utilisateur entre dans une erreur lors de l'écriture d'une requête, car les correspondances floues rechercheront des termes avec des orthographes similaires. Pour les chaînes, la valeur d'ambiguïté est basée sur la distance maximale de Levinstein autorisée pour chaque terme. Voici un exemple avec l'ambiguïté.

<code>npm install elasticsearch --save</code>

Recherche dans plusieurs champs

Si vous souhaitez rechercher dans plusieurs champs, vous pouvez utiliser Multi_Match pour rechercher des types. Il est similaire de correspondre, sauf qu'au lieu d'utiliser le champ comme clé dans l'objet de requête de recherche, nous ajoutons une touche de champ, qui est un tableau de champs à rechercher. Ici, nous recherchons dans le titre, auteurs.firstname et auteurs.lastName Fields. (Lien vers le code source)

<code>const elasticsearch = require('elasticsearch');</code>

La requête multi_match prend en charge d'autres propriétés de recherche telles que minimum_should_match et flou. Elasticsearch prend en charge les jilèges (tels que *) pour correspondre à plusieurs champs, nous pouvons donc raccourcir l'exemple ci-dessus vers ['title', 'auteurs. * Nom'].

Faites correspondre la phrase complète

Elasticsearch peut également correspondre exactement aux phrases entrées sans correspondance au niveau du terme. Cette requête est une extension d'une requête de match régulière appelée match_phrase. Voici un exemple de match_phrase. (Lien vers le code source)

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

combinant plusieurs requêtes

Jusqu'à présent, dans l'exemple, nous n'avons utilisé qu'une seule requête par demande. Cependant, Elasticsearch vous permet de combiner plusieurs requêtes. La requête composite la plus courante est Bool. La requête bool accepte quatre types de clés: doit, doit, must_not et filtre. Comme son nom l'indique, les documents du résultat doivent correspondre à la requête dans MUST, ne peut pas correspondre à la requête dans MUST_NOT, si elles correspondent à la requête dans devraient, vous obtiendrez un score plus élevé. Chacun des éléments ci-dessus peut recevoir plusieurs requêtes sous la forme d'un tableau de requête. Ci-dessous, nous utilisons Bool Query avec un nouveau type de requête Query_string. Cela vous permet d'écrire des requêtes plus avancées en utilisant des mots clés comme et et et. La documentation complète de la syntaxe Query_string est disponible ici. De plus, nous utilisons une requête de portée (documentée ici), qui nous permet de limiter les champs à une plage donnée. (Lien vers le code source)

Dans l'exemple ci-dessus, la requête renvoie le nom de l'auteur qui contient Term1

ou
<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>
leur nom de famille contient Term2,

et leur titre contient Term3, et ils ne l'étaient pas en 2011 , 2012 ou documents publiés en 2013. De plus, les documents contenant une phrase donnée dans leur corps obtiendront des scores plus élevés et seront affichés en haut du résultat (car la requête de correspondance est dans la clause devrait). Filtres, agrégations et recommandations

En plus de ses capacités de recherche avancées, Elasticsearch propose des fonctionnalités supplémentaires. Ici, nous regardons trois fonctionnalités plus courantes.

Filtre

Habituellement, vous pouvez affiner vos résultats de recherche en fonction de critères spécifiques. Elasticsearch fournit cette fonctionnalité via des filtres. Dans nos données d'article, disons que votre recherche renvoie plusieurs articles à partir desquels vous souhaitez sélectionner uniquement ceux publiés au cours de cinq années spécifiques. Vous pouvez simplement filtrer tout ce qui ne correspond pas à vos critères à partir de vos résultats de recherche sans modifier l'ordre de recherche.

La différence entre un filtre et la même requête dans la clause incontournable d'une requête bool est que le filtre n'affecte pas le score de recherche, et la requête incontournable affectera. Lorsque les résultats de la recherche sont retournés et que les utilisateurs filtrent en fonction de certains critères, ils ne veulent pas modifier l'ordre de résultat d'origine, mais veulent simplement supprimer des documents non pertinents du résultat. Les filtres suivent le même format que les recherches, mais plus souvent, ils sont définis sur des champs avec des valeurs définies plutôt que des chaînes de texte. Elasticsearch recommande d'ajouter des filtres via la clause de filtre de la requête de recherche composite Bool.

Continuez avec l'exemple ci-dessus, supposons que nous voulons limiter nos résultats de recherche aux articles publiés de 2011 à 2015. Pour ce faire, nous avons juste besoin d'ajouter une requête de plage à la partie filtrante de la requête de recherche d'origine. Cela supprimera tous les documents incompatibles du résultat. Voici un exemple de filtrage des requêtes. (Lien vers le code source)

<code>java -version</code>

Polymérisation

Le cadre d'agrégation fournit diverses données agrégées et statistiques basées sur les requêtes de recherche. Les deux principaux types d'agrégation sont les métriques et le regroupement, où l'agrégation métrique suit et calcule les mesures sur un ensemble de documents, tandis que l'agrégation groupée construit des seaux, chacun associé à une clé et à une condition de document. Des exemples d'agrégation métrique comprennent la moyenne, le minimum, le maximum, la somme et le nombre de valeurs. Des exemples d'agrégation groupé comprennent les plages, les gammes de dates, les histogrammes et la terminologie. Une explication approfondie de l'agrégateur peut être trouvée ici.

Les agrégations sont placées à l'intérieur de l'objet d'agrégats, qui est lui-même placé directement dans le corps de l'objet de recherche. Dans l'objet agrégats, chaque clé est le nom attribué par l'utilisateur à l'agrégateur. Le type d'agrégateur et les options doivent être placés comme valeur de cette clé. Ensuite, nous regardons deux agrégateurs différents, un agrégateur métrique et un agrégateur de godets. En tant qu'agrégateur métrique, nous essayons de trouver la valeur minimale de l'année (poteau le plus ancien) de l'ensemble de données, et pour l'agrégateur de seau, nous essayons de trouver le nombre d'occurrences de chaque mot-clé. (Lien vers le code source)

<code>npm install elasticsearch --save</code>
Dans l'exemple ci-dessus, nous nommons l'agrégateur métrique min_year (ce nom peut être n'importe quel nom), qui est une agrégation de type min sur le champ de l'année. L'agrégateur de godets est nommé Mots-clés, qui est une agrégation du type de termes effectué sur le champ Mots-clés. Les résultats de l'agrégat sont contenus dans l'élément d'agrégations dans la réponse, et à un niveau plus profond, ils contiennent chaque agrégateur défini (min_year et mots clés ici) et leurs résultats. Voici une réponse partielle à cet exemple.

<code>const elasticsearch = require('elasticsearch');</code>
Par défaut, jusqu'à 10 seaux sont renvoyés dans la réponse. Vous pouvez ajouter une clé de taille à côté du champ dans la demande pour déterminer le nombre maximum de seaux renvoyés. Si vous souhaitez recevoir tous les seaux, définissez cette valeur sur 0.

Suggestions

Elasticsearch a plusieurs types de suggestifs qui peuvent fournir des suggestions de remplacement ou d'achèvement pour les termes d'entrée (documentés ici). Nous allons vérifier le terme et la suggestion de phrases ici. Le terme Suggester fournit des conseils pour chaque terme dans le texte d'entrée (le cas échéant), tandis que la phrase Suggester traite le texte d'entrée comme une phrase complète (plutôt que de la décomposer en termes) et fournit d'autres suggestions de phrases (le cas échéant). Pour utiliser l'API de suggestion, nous devons appeler la méthode de suggestion sur le client Node.js. Voici un exemple d'un terme suggère. (Lien vers le code source)

<code>java -version</code>

Dans le corps de la demande, conformément à toutes les autres méthodes du client, nous avons un champ d'index qui détermine l'index de la recherche. Dans la propriété Body, nous ajoutons le texte que nous recherchons pour des suggestions et (comme avec l'objet agrégé), nous attribuons un nom à chaque suggère (dans ce cas, titres de titres). Sa valeur détermine le type et les options du suggestion. Dans ce cas, nous utilisons un terme suggère pour le champ de titre et limitant le nombre maximal de suggestions par balise à cinq (taille: 5).

La réponse de l'API suggérée contient une clé pour chaque suggestion que vous demandez, qui est un tableau de tailles qui sont les mêmes que le nombre de termes dans le champ de texte. Pour chaque objet de ce tableau, il existe un objet d'options dont le champ de texte contient des suggestions. Ce qui suit est une réponse partielle à la demande ci-dessus.

<code>npm install elasticsearch --save</code>
Pour obtenir des suggestions de phrases, nous pouvons suivre le même format que ci-dessus, remplacez simplement le type de suggestion par la phrase. Dans l'exemple suivant, la réponse suit le même format que celle expliquée ci-dessus. (Lien vers le code source)

<code>const elasticsearch = require('elasticsearch');</code>

lecture complémentaire

Elasticsearch fournit un large éventail de fonctionnalités, bien au-delà de la portée de cet article. Dans cet article, j'essaie d'expliquer ses fonctionnalités à un niveau élevé et je me réfère à des ressources appropriées pour plus d'apprentissage. Elasticsearch est très fiable et a d'excellentes performances (j'espère que vous l'avez remarqué lors de l'exécution des exemples). Ceci, associé à un soutien communautaire croissant, augmente l'adoption de la recherche sur l'industrie, en particulier parmi les entreprises qui traitent les données en temps réel ou les mégadonnées.

Après avoir soigneusement lu les exemples fournis ici, je vous recommande fortement de consulter la documentation. Ils fournissent deux sources principales, l'une est une référence à Elasticsearch et à ses fonctionnalités, et l'autre est un guide qui se concentre davantage sur la mise en œuvre, les cas d'utilisation et les meilleures pratiques. Vous pouvez également trouver une documentation détaillée pour le client Node.js ici.

utilisez-vous déjà Elasticsearch? Quelle est votre expérience? Ou prévoyez-vous de l'essayer après avoir lu ceci? Veuillez me le faire savoir dans les commentaires ci-dessous.

FAQS (FAQ) sur le nœud de moteur de recherche ELLASTICSEARCH

Quelle est la différence entre Elasticsearch et d'autres moteurs de recherche (tels que ElasticLunr ou MiniSearch)?

Elasticsearch est un moteur de recherche et d'analyse puissant, distribué et open source. Il est conçu pour traiter de grandes quantités de données et fournir des résultats de recherche en temps réel. D'un autre côté, ElasticLunr et MiniSearch sont des bibliothèques de recherche de clients légères pour JavaScript. Ils sont conçus pour des ensembles de données plus petits et sont souvent utilisés dans les applications basées sur le navigateur. Alors qu'ElasticSearch propose des fonctionnalités plus avancées telles que la recherche distribuée, l'analyse des données et les capacités d'apprentissage automatique, ElasticLunr et MiniSearch sont plus faciles à utiliser pour les capacités de recherche de base.

Comment implémenter Elasticsearch dans l'application Node.js?

La mise en œuvre d'Elasticsearch dans l'application Node.js implique plusieurs étapes. Tout d'abord, vous devez installer le package Elasticsearch à l'aide de NPM. Ensuite, vous devez créer une instance client Elasticsearch et le connecter à votre serveur Elasticsearch. Après cela, vous pouvez utiliser les méthodes du client pour effectuer diverses actions, telles que l'indexation des documents, la recherche de données et la gestion de votre cluster Elasticsearch.

Puis-je construire un moteur de recherche dans mon navigateur à l'aide d'Elasticsearch?

Bien qu'Elasticsearch soit principalement conçu pour les applications côté serveur, il peut être utilisé dans les applications basées sur le navigateur à l'aide du serveur Node.js. Le serveur peut agir comme un proxy entre le navigateur et le serveur Elasticsearch, gérant toutes les demandes et réponses de recherche. Cependant, pour les cas d'utilisation plus simples, une bibliothèque de recherche de clients comme ElasticLunr ou MiniSearch peut être un meilleur choix.

Comment Elasticsearch se compare-t-il aux autres packages de recherche NPM?

Elasticsearch est l'un des packages de recherche les plus populaires sur NPM, grâce à ses fonctionnalités puissantes et son évolutivité. Il fournit un ensemble complet d'API pour l'indexation, la recherche et l'analyse des données. Cependant, il est plus complexe et à forte intensité de ressources que les autres packages de recherche NPM. Si vous travaillez sur un petit projet ou si vous avez besoin de fonctionnalités de recherche simples, d'autres packages NPM tels que Search-Index ou JS-Search peuvent être plus appropriés.

Comment construire un moteur de recherche simple du navigateur à l'aide de JavaScript?

Création d'un simple moteur de recherche dans le navigateur à l'aide de JavaScript comprend la création d'index de données, l'implémentation des fonctions de recherche et l'affichage des résultats de recherche. Vous pouvez simplifier ce processus à l'aide de bibliothèques de recherche JavaScript comme ElasticLunr ou MinISEarch. Ces bibliothèques fournissent des API faciles à utiliser pour indexer et rechercher des données et peuvent être utilisées directement dans le navigateur sans exigences de serveur.

Quels sont les avantages de l'utilisation d'Elasticsearch pour la recherche dans mon application?

ElasticSearch offre de nombreux avantages pour la mise en œuvre des capacités de recherche dans votre application. Il fournit des résultats de recherche en temps réel, ce qui signifie qu'une fois le document indexé, il devient consultable. Il prend également en charge des requêtes de recherche complexes, vous permettant de rechercher des données en fonction de plusieurs critères. De plus, Elasticsearch est très évolutif et peut gérer de grandes quantités de données sans affecter les performances.

Comment Elasticsearch gère-t-il l'indexation des données?

Elasticsearch utilise une structure de données appelée indexation inversée pour l'indexation des données. Cela lui permet de trouver rapidement des documents qui correspondent à la requête de recherche. Lorsqu'un document est indexé, Elasticsearch analyse le contenu et crée une liste de mots uniques, puis stocke les mots dans l'index inversé ainsi que des informations sur leur position dans le document.

Puis-je utiliser Elasticsearch pour l'analyse des données?

Oui, Elasticsearch n'est pas seulement un moteur de recherche, mais aussi un puissant outil d'analyse de données. Il prend en charge l'agrégation, vous permettant d'agréger et d'analyser vos données de diverses manières. Vous pouvez utiliser Elasticsearch pour effectuer des tâches d'analyse des données complexes telles que le calcul de la moyenne, de la somme ou du nombre, de trouver des valeurs minimales ou maximales, de regroupement des données basées sur des conditions spécifiques, et plus encore.

Elasticsearch est-il adapté aux applications de Big Data?

Oui, Elasticsearch est conçu pour gérer les applications de Big Data. Il s'agit d'un système distribué, ce qui signifie qu'il peut évoluer horizontalement en ajoutant plus de nœuds au cluster. Cela lui permet de traiter de grandes quantités de données et de fournir des résultats de recherche rapides même sous des charges lourdes. De plus, Elasticsearch prend en charge le fragment et la réplication, ce qui améliore encore son évolutivité et sa fiabilité.

Comment optimiser les performances des applications Elasticsearch?

Il existe plusieurs façons d'optimiser les performances de votre application Elasticsearch. Tout d'abord, vous devez configurer correctement le cluster Elasticsearch, y compris le nombre de nœuds, de fragments et de répliques. Deuxièmement, vous devez optimiser le processus d'indexation en utilisant l'indexation par lots, en désactivant les rafraîchissements et en utilisant l'analyseur correct. Enfin, vous devez optimiser autant que possible vos requêtes de recherche en utilisant des filtres au lieu des requêtes, en évitant les grandes agrégations et en utilisant l'API "Expliquer" pour comprendre comment la requête est exécutée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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