Chapitre 5: Analyse de vos données

Ce chapitre couvre

  • Analyser le texte de votre document avec Elasticsearch
  • Utilisation de l’API d’analyse
  • Tokenization
    Filtres de caractère
  • Filtres de jetons
  • Stemming
  • Analyseurs inclus avec Elasticsearch

Jusqu’à présent, nous avons couvert l’indexation et la recherche de vos données, mais que se passe-t-il lorsque vous envoyez des données à Elasticsearch? Qu’advient-il du texte envoyé dans un document à Elasticsearch? Comment Elasticsearch peut-il trouver des mots spécifiques dans des phrases, même si la casse (miniscue ou majuscule)change? Par exemple, lorsqu’un utilisateur recherche «nosql», vous voudrez généralement qu’un document contenant la phrase «partagez votre expérience avec NoSql & Big Data Technologies» puisse être retourné, car il contient le mot « NoSql »(N,S sont en majuscule). Vous pouvez utiliser les informations que vous avez apprises au chapitre précédent pour effectuer une recherche query_string sur «nosql» et rechercher le document. Dans ce chapitre, vous apprendrez pourquoi l’utilisation de cette query renvoie le document demandé. Une fois ce chapitre terminé, vous aurez une meilleure idée de la manière dont l’analyse d’Elasticsearch vous permet de rechercher vos documents de manière plus flexible.

5.1. QU’EST-CE QUE L’ANALYSE?

L’analyse est le processus qu’Elasticsearch exécute sur le corps d’un document avant que celui-ci ne soit envoyé pour être ajouté à l’index inversé. Elasticsearch franchit plusieurs étapes pour chaque champ à analyser avant que le document ne soit ajouté à l’index:

  • Filtre de charactères – Transforme les caractères à l’aide d’un filtre de charactères
  • Diviser le texte en jetons – Divise le texte en un ou plusieurs jetons.
  • Filtre de jetons – Transforme chaque jeton à l’aide d’un filtre de jetons
  • Indexation de jetons – Stocke ces jetons dans l’index

Nous aborderons chaque étape plus en détail par la suite, mais examinons d’abord l’ensemble du processus résumé dans un diagramme. La figure 5.1 montre le texte «share your experience with NoSql & big data technologies» transformé en jetons analysés: shareyourexperiencewithnosqlbigdatatools, and technologies. L’analyseur présenté est un analyseur personnalisé créé à l’aide de tokenizers, de filtres de charactère/jetons fournis. Nous discuterons plus en détail de l’analyseur personnalisé plus loin dans ce chapitre.

5.1.1. Filtre de charactères

Comme vous pouvez le voir en haut à gauche de la figure, Elasticsearch exécute d’abord les filtres de charactère; ces filtres sont utilisés pour transformer des séquences de caractères particulières en d’autres séquences de caractères. Cela peut être utilisé pour supprimer du texte HTML ou convertir un nombre arbitraire de caractères en d’autres caractères (peut-être en corrigeant le raccourcissement du message textuel de «I love u 2» en «I love you too»). Dans la figure 5.1, nous utilisons le filtre de caractères pour remplacer «&» par le mot «and».

5.1.2. Division du texte en jetons

Une fois les filtres de charactères appliqués au texte, il doit être divisé en éléments exploitables. Lucene lui-même n’agit pas sur de grandes chaînes de données; au lieu de cela, il agit sur ce qu’on appelle des jetons(tokens). Les jetons sont générés à partir d’un morceau de texte, ce qui donne un nombre quelconque (même zéro!) de jetons. La division classique est effectué par le tokenizer standard, qui divise le texte en jetons, basé sur des espaces et les nouvelles lignes, mais aussi sur certains caractères comme le tiret. Dans la figure 5.1, cela est représenté par la division de la chaîne «share your experience with NoSql and big data technologies» en –>  shareyourexperiencewithNoSqlandbigdata, and technologies.

5.1.3. Filtre de jetons

Une fois le bloc de texte converti en jetons, Elasticsearch appliquera ensuite à chaque jeton ce que l’on appelle des filtres de jetons. Ces filtres de jetons prennent un jeton en entrée et peuvent le modifier, ajouter ou supprimer plus de jetons selon les besoins. L’un des exemples les plus utiles et les plus communs d’un filtre de jeton est le filtre de jeton en minuscule, qui enregistre un jeton et le met en minuscule pour vous permettre de rechercher une rencontre (get-together) à propos de «NoSql» lorsque vous recherchez le terme «nosql» . Les jetons peuvent passer par plus d’un filtre de jetons, chacun faisant des choses différentes afin de mouler les données dans le meilleur format pour votre index.

5.1.4. Indexation de jetons

Une fois que les jetons ont traversé zéro ou plusieurs filtres de jetons, ils sont envoyés à Lucene pour être indexés pour le document. Ces jetons constituent l’index inversé dont nous avons parlé au chapitre 1.

Ensemble, ces différentes parties constituent un analyseur, qui peut également être défini comme zéro ou plusieurs filtres de charactère, un tokenizer et zéro ou plusieurs filtres de token. Nous allons parler de certains analyseurs préconfigurés plus loin dans ce chapitre que vous pouvez utiliser sans avoir à construire le vôtre, mais nous allons d’abord parler des composants individuels d’un analyseur.



Analyse lors de l’exécution d’une recherche

Selon le type de query que vous utilisez, cette analyse peut également être appliquée au texte de recherche avant que la recherche ne soit effectuée sur l’index. En particulier, les queries telles que : match et match_phrase effectuent une analyse avant la recherche, contrairement aux queries telles que term and terms. Il est important de garder cela à l’esprit lors du débogage, pour savoir pourquoi une recherche donnée correspond ou non à un document. Elle peut être analysée différemment de ce à quoi vous vous attendez! Il existe même une option de configuration pour configurer un analyseur différent, et utilisé lors de la recherche par rapport à celui mis en place pour l’indexation. Nous verrons plus à ce sujet lorsque nous discuterons de l’analyseur ngram. Consultez la section 4.2.1 pour plus de détails sur les queries match et term.



Maintenant que vous comprenez ce qui se passe pendant la phase d’analyse d’Elasticsearch, voyons comment les analyseurs classique et ceux customisés sont spécifiés pour les champs de votre mapping.

5.2. UTILISER DES ANALYSEURS POUR VOS DOCUMENTS

Il est utile de connaître les différents types d’analyseurs et de filtres de jetons, mais avant de pouvoir les utiliser pour vous, Elasticsearch doit savoir comment vous souhaitez les utiliser. Par exemple, vous pouvez spécifier dans le mapping quels tokenizer et filtres de jeton individuels utiliser pour un analyseur et quel analyseur utiliser pour quel champ.

Il existe deux manières de spécifier des analyseurs pouvant être utilisés par vos champs:

  • Lorsque l’index est créé, en tant que paramètres pour cet index particulier
  • En tant qu’analyseurs globaux dans le fichier de configuration pour Elasticsearch

En règle générale, pour être plus flexible, il est plus facile de spécifier les analyseurs au moment de la création de l’index, ce qui est également le cas lorsque vous souhaitez spécifier vos mapping. Cela vous permet de créer de nouveaux index avec des analyseurs mis à jour ou totalement différents. D’autre part, si vous vous retrouvez à utiliser le même ensemble d’analyseurs dans vos index sans les modifier très souvent, vous pouvez également économiser de la bande passante en les plaçant dans le fichier de configuration. Examinez comment vous utilisez Elasticsearch et choisissez l’option qui vous convient le mieux. Vous pouvez même combiner les deux et placer les analyseurs utilisés par tous vos index dans le fichier de configuration et spécifier des analyseurs supplémentaires pour une stabilité accrue lors de la création d’index.

Quelle que soit la manière dont vous spécifiez vos analyseurs personnalisés, vous devez spécifier quel champ utilise quel analyseur dans le mapping de votre index, soit en spécifiant le mapping lors de la création de l’index, soit en utilisant une requête PUT sur l’endpoint mapping plus tard.

5.2.1. Ajouter des analyseurs lors de la création d’un index

Au chapitre 3, vous avez vu quelques-uns des paramètres lors de la création d’un index, notamment les paramètres comme nombre de fragments primaires et de répliques d’un index:

L’ajout d’un analyseur personnalisé se fait en spécifiant un autre json la configuration des paramètres sous la clé d’index. Cette clé doit spécifier l’analyseur personnalisé que vous souhaitez utiliser. Elle peut également contenir le tokenizer personnalisé, les filtres de jeton et les filtres de charactères que l’index peut utiliser. La liste suivante montre un analyseur personnalisé qui spécifie des parties personnalisées de toutes les étapes de l’analyse. Ceci est un exemple complexe, nous avons donc ajouté quelques titres pour montrer les différentes parties. Ne vous préoccupez pas encore de tous les détails du code, car nous les verrons plus loin dans ce chapitre.

Les mappings ont été omis de la figures ici car nous expliquerons comment spécifier l’analyseur pour un champ dans la section 5.2.3. Dans cet exemple, vous créez un analyseur personnalisé appelé myCustomAnalyzer, qui utilise le tokenizer personnalisé myCustomTokenizer, deux filtres personnalisés nommés myCustomFilter1 et myCustomFilter2, ainsi qu’un filtre de charactère personnalisé nommé myCustomCharFilter (vous remarquez une tendance ici?). Chacune de ces parties d’analyse distinctes est donnée dans JSON respectifs. Vous pouvez spécifier plusieurs analyseurs avec des noms différents et les combiner dans des analyseurs personnalisés pour vous offrir des options d’analyse flexibles lors de l’indexation et de la recherche.

Maintenant que vous avez une idée de l’ajout d’analyseurs personnalisés lorsqu’un index est créé, examinons les mêmes analyseurs ajoutés à la configuration d’Elasticsearch.

5.2.2. Ajout d’analyseurs à la configuration Elasticsearch

Outre la spécification des analyseurs avec des paramètres lors de la création d’index, l’ajout d’analyseurs dans le fichier de configuration Elasticsearch est un autre moyen pris en charge pour spécifier des analyseurs personnalisés. Mais il y a des compromis à cette méthode; Si vous spécifiez les analyseurs lors de la création d’index, vous pourrez toujours les modifier sans redémarrer Elasticsearch. Mais si vous spécifiez les analyseurs dans la configuration Elasticsearch, vous devrez redémarrer Elasticsearch pour prendre en compte les modifications que vous apportez aux analyseurs. En revanche, vous aurez moins de données à envoyer lors de la création d’index. Bien qu’il soit généralement plus facile de les spécifier lors de la création d’index pour un plus grand degré de flexibilité, si vous prévoyez de ne jamais changer vos analyseurs, vous pouvez les insérer dans le fichier de configuration.

Spécifier des analyseurs dans le fichier de configuration elasticsearch.yml revient à les spécifier en tant que JSON; Voici les mêmes analyseurs personnalisés de la section précédente, mais spécifiés dans le fichier de configuration YAML:

5.2.3. Spécification de l’analyseur pour un champ dans le mapping

Avant de pouvoir analyser des champs avec des analyseurs personnalisés, il reste un élément du puzzle à résoudre: comment spécifier qu’un champ particulier de la cartographie doit être analysé à l’aide de l’un de vos analyseurs personnalisés. Il est simple de spécifier l’analyseur pour un champ en définissant le champ de l’analyseur sur un mapping. Par exemple, si vous aviez le mappage pour un champ appelé description, spécifier l’analyseur ressemblerait à ceci:

Si vous souhaitez qu’un champ particulier ne soit pas du tout analysé, vous devez spécifier le champ d’index avec le paramètre not_analyzed. Cela permet de conserver le texte sous forme de jeton unique sans aucune forme de modification (pas de minuscules ni rien). Cela ressemble à quelque chose comme ceci:

Un modèle courant pour les champs dans lesquels vous souhaitez effectuer une recherche à la fois sur le texte analysé et sur le texte intégral d’un champ consiste à les placer dans plusieurs champs.

Utilisation de types multi-champs pour stocker du texte analysé différemment

Il est souvent utile de pouvoir effectuer une recherche à la fois sur la version analysée d’un champ et sur le texte original non analysé. Ceci est particulièrement utile pour des opérations telles que les agrégations ou le tri sur un champ de type chaine de charactère. Elasticsearch simplifie cette tâche en utilisant les champs multiples, que vous avez vus au chapitre 3. Prenez le champ name de groupe dans l’index get-together, par exemple; vous souhaiterez peut-être trier à partir du champ name, et le rechercher aussi à l’aide d’une analyse. Vous pouvez spécifier un champ qui fait les deux comme ceci:

Nous avons expliqué comment spécifier des analyseurs; Nous allons maintenant vous montrer un moyen astucieux de vérifier comment n’importe quel texte serait analysé via votre moteur de recherche: l’API d’analyse.

5.3. ANALYSE DE TEXTE AVEC L’API ANALYSE

L’utilisation de l’API d’analyse pour tester le processus d’analyse peut s’avérer extrêmement utile pour suivre la manière dont les informations sont stockées dans vos index Elasticsearch. Cette API vous permet d’envoyer n’importe quel texte à Elasticsearch en spécifiant les filtres à utiliser pour l’analyseur, le tokenizer ou les token, et de récupérer les tokens analysés. La figure suivante montre un exemple de l’API d’analyse, qui utilise l’analyseur standard pour analyser le texte «share your experience with NoSql & big data technologies».

La sortie la plus importante de l’API d’analyse est la clé token. Le résultat est une liste de ces json, qui vous donne une représentation de ce à quoi ressemblent les jetons traités (ceux qui vont être réellement écrits dans l’index). Par exemple, avec le texte «share your experience with NoSql & big data technologies», vous obtenez huit jetons: shareyourexperiencewithnosqlbigdata, and technologies. Notez que dans ce cas, avec l’analyseur standard, chaque jeton était en minuscule et la ponctuation à la fin de la phrase a été supprimée. C’est un excellent moyen de tester les documents pour voir comment Elasticsearch les analysera. Il existe de nombreuses façons de personnaliser l’analyse effectuée sur le texte.

5.3.1. Sélection d’un analyseur

Si vous avez déjà un analyseur en tête et souhaitez savoir comment il traite du texte, vous pouvez définir le paramètre analyser sur le nom de l’analyseur. Nous allons passer en revue les différents analyseurs intégrés dans la section suivante, donc gardez cela à l’esprit si vous voulez essayer l’un d’eux!

Si vous avez configuré un analyseur dans votre fichier elasticsearch.yml, vous pouvez également le référencer par son nom dans le paramètre analyser. De plus, si vous avez créé un index avec un analyseur personnalisé similaire à l’exemple de la figure 5.2, vous pouvez toujours utiliser cet analyseur par son nom, mais au lieu d’utiliser l’endpoint  / _search, vous devrez d’abord spécifier l’index. Un exemple utilisant l’index nommé get-together et un analyseur appelé myCustomAnalyzer est présenté ici:

5.3.2. Combinaison de plusieurs parties pour créer un analyseur impromptu

Parfois, vous souhaiterez peut-être ne pas utiliser un analyseur intégré, mais plutôt essayer une combinaison de tokenizers et de filtres de token, par exemple, pour voir comment un tokenizer particulier décompose une phrase sans autre analyse. Avec l’API d’analyse, vous pouvez spécifier un tokenizer et une liste de filtres de jetons à utiliser pour analyser le texte. Par exemple, si vous souhaitez utiliser le tokenizer des espaces blancs (pour scinder le texte sur des espaces), puis utiliser les filtres de minuscules et de jetons inversés, procédez comme suit:

Vous recevrez les jetons suivants:

Ce tokenizer a tout d’abord divisé la phrase «share your experience with NoSql & big data technologies» en: « shareyourexperiencewithNoSql&bigdatatechnologies« . Ensuite, les jetons sont mis en minuscule et, finalement, ils inversent chaque jeton pour obtenir les termes fournis.

5.3.3. Analyse basée sur le mapping champ

Une autre chose utile à propos de l’API d’analyse une fois que vous avez commencé à créer des mapping pour un index est qu’Elasticsearch vous permet d’analyser  en fonction de l’analyser déjà définis sur un champs specifique durant son mapping. Si vous créez un mapping pour le champ description, vous aurez ceci:

vous pouvez ensuite utiliser l’analyseur associé au champ en spécifiant le paramètre field dans la requête:

L’analyseur personnalisé sera automatiquement utilisé car c’est l’analyseur associé au champ description. N’oubliez pas que pour utiliser cela, vous devez spécifier un index, car Elasticsearch doit pouvoir obtenir le mapping d’un champ particulier à partir d’un index.

Maintenant que nous avons expliqué comment tester différents analyseurs à l’aide de CURL, nous allons passer directement à tous les différents analyseurs fournis par Elasticsearch. N’oubliez pas que vous pouvez toujours créer votre propre analyseur en combinant les différentes parties (jetons et filtres de jetons).

5.3.4. En savoir plus sur les termes indexés en utilisant l’API  terms vector

Lorsque vous réfléchissez au bon analyseur, l’enpoint  _analyze de la section précédente est une bonne méthode. Mais si vous souhaitez en savoir plus sur les termes d’un document, il existe un moyen plus efficace que d’explorer tous les champs. Vous pouvez utiliser le endpoint  _termvector pour obtenir plus d’informations sur tous les termes: leur fréquence dans le document, l’index et leur emplacement.

L’utilisation de base du endpoint _termvector ressemble à ceci:

Vous pouvez configurer certaines choses, notamment les statistiques des termes; sachez qu’il s’agit d’une opération lourde. La commande suivante montre comment le faire, tout en spécificiant les termes ciblés:

Voici une partie de la réponse. Un seul terme est affiché et la structure est identique à celle de l’exemple de code précédent:

A présent, vous avez une meilleure idée du travail des analyseurs et sur la manière d’exploiter leurs résultats. Vous continuerez à utiliser les API _analyze et _termvector lors de l’exploration des analyseurs intégrés dans la section suivante.

5.4. ANALYSEURS, TOKENIZERS ET FILTRES À JETONS

Dans cette section, nous aborderons les analyseurs, les tokenizers et les filtres de token intégrés fournis par Elasticsearch. Elasticsearch en fournit un grand nombre, tels que des minuscules, des raccourcis, des langues spécifiques, des synonymes, etc., ainsi de suite. Vous avez la possibilité de les combiner de différentes manières pour obtenir les jetons souhaités.

5.4.1. Analyseurs intégrés

Cette section présente un aperçu des analyseurs fournis avec Elasticsearch. N’oubliez pas qu’un analyseur est composé d’un filtre de caractères facultatif, d’un seul tokenizer et de zéro ou plusieurs filtres de jetons. La figure 5.2 est un aperçu d’un analyseur.

Nous ferons référence aux tokenizers et aux filtres de jetons, que nous verrons plus en détail dans les sections suivantes. Avec chaque analyseur, nous incluons un exemple de texte qui montre à quoi ressemble l’analyse effectuée à l’aide de cet analyseur.

Classique
L‘analyseur standard est l’analyseur par défaut pour le texte lorsqu’aucun analyseur n’est spécifié. Il combine les valeurs par défaut sensibles pour la plupart des langues européennes en combinant le tokenizer standard, le filtre de token standard, le filtre de token minuscule et le filtre de token stop. Il n’ya pas grand chose à dire sur l’analyseur standard. Nous parlerons de ce que font le tokenizer standard et le filtre de jetons standard dans les sections 5.4.2 et 5.4.3; Gardez simplement à l’esprit que si vous ne spécifiez pas d’analyseur pour un champ, l’analyseur standard sera utilisé.

{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
--->
[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

Simple
L’analyseur simple n’est que cela – simple! Il utilise le tokenizer minuscule, ce qui signifie que les jetons sont divisés en mot. Ici le séparateur est n’importe quel charactère qui ne soit pas un mot(espaces, -, chiffres, &,$…etc). Ensuite ils sont automatiquement transformés en minuscules. Cet analyseur ne fonctionne pas bien pour les langues asiatiques qui ne séparent pas les mots par des espaces, utilisez-le uniquement pour les langues européennes.

{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
--->
[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

Espace blanc
L’analyseur whitspace ne fait que diviser le texte en jetons autour des espaces – très simple!

{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
--->
[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

Stop
L’analyseur stop se comporte comme un analyseur simple, mais en plus filtre les mots stop du flux de jetons.

{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
--->
[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ] Ici the est un mot stop par défaut. Possibilité d'en rajouter.

Mot-clé
L’analyseur Keyword prend l’intégralité du champ et génère un seul jeton dessus. N’oubliez pas qu’au lieu d’utiliser le générateur de mots-clés dans vos mappings, il est préférable de définir le paramètre d’index sur not_analyzed.

POST _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
---->

[ The 2 QUICK BrownFoxes jumped over the lazy dog‘s bone. ]

Pattern
L’analyseur pattern vous permet de spécifier un pattern pour la séparation des tokens. Toutefois, étant donné que le pattern doit être spécifié  de façon la plus générale possible, il est souvent plus judicieux d’utiliser un analyseur personnalisé et de combiner le tokenizer pattern existant avec tous les filtres de jetons nécessaires.

Langue et multilingue
Elasticsearch prend en charge une grande variété d’analyseurs prêts à l’emploi et spécifiques à une langue. Il y a des analyseurs pour l’arabe, l’arménien, le basque, le brésilien, le bulgare, le catalan, le chinois, cjk, tchèque, danois, néerlandais, anglais, finnois, français, galicien, allemand, grec, irlandais, hindi, hongrois, hongrois, indonésien, italien et norvégien, persan, portugais, roumain, russe, sorani, espagnol, suédois, turc et thaï. Vous pouvez spécifier l’analyseur spécifique à la langue en utilisant l’un de ces noms, mais assurez-vous d’utiliser le nom en minuscule! Si vous souhaitez analyser une langue ne figurant pas dans cette liste, il peut également y avoir un plugin.

Boule de neige
L’analyseur snowball de neige utilise le tokenizer standard et le filtre token (comme l’analyseur standard), avec le filtre token minuscule et le filtre d’arrêt; il utilise également le mechanisme de stemming. Ne vous inquiétez pas si vous ne savez pas encore ce que c’est. Nous en discuterons plus en détail vers la fin de ce chapitre.

Avant de pouvoir comprendre complètement ces analyseurs, vous devez comprendre les éléments qui composent l’analyseur. Nous allons maintenant aborder les tokenizers pris en charge par Elasticsearch.

5.4.2. Tokenization

La tokénisation consiste à prendre une chaîne de charactères et à la diviser en fragments plus petits appelés jetons(token). Tout comme Elasticsearch inclut des analyseurs prêts à l’emploi, il comprend également un certain nombre de tokenizers intégrés.

Tokenizer standard
Le tokenizer standard est un tokenizer basé sur la grammaire qui convient à la plupart des langues européennes; il gère également la segmentation du texte Unicode, mais avec une longueur de jeton maximale de 255 par défaut. Il supprime également les signes de ponctuation tels que les virgules et les points:

Les jetons sont: I, have, and potatoes

Mot-clé
Le tokenizer keyword est un tokenizer simple qui prend la totalité du texte et le fournit sous forme de jeton unique aux filtres de jetons. Cela peut être utile lorsque vous souhaitez uniquement appliquer des filtres de jetons sans effectuer aucune sorte de tokenization:

Les tokens résultants sont: Hi et there.

Lettre
Le tokenizer letter prend le texte et le divise en jetons pour des choses qui ne sont pas des lettres. Par exemple, avec la phrase «Hi, there.», Les jetons seraient Hi et there car la virgule, l’espace et le point ne sont pas des lettres:

Les tokens sont: Hi et there

Espace blanc
Le tokenizer whitespces sépare les jetons par des espaces: espace, tabulation, saut de ligne, etc. Notez que ce tokenizer ne supprime aucun type de ponctuation, aussi le fait de marquer le texte « Hi, there » génère deux jetons: Hi et there:

Pattern
Le tokenizer pattern vous permet de spécifier un motif arbitraire selon lequel le texte doit être divisé. Le modèle spécifié doit correspondre aux caractères d’espacement; Par exemple, si vous souhaitez scinder le texte à chaque nombre à deux chiffres, vous pouvez créer un analyseur personnalisé qui décompose les jetons à l’endroit où le texte est utilisé .-. se produit, ce qui ressemblerait à ceci:

Les tokens sont: breakingsome, et text.

Adresse email UAX
Le tokenizer standard est assez efficace pour comprendre les mots anglais, mais de nos jours, il y a beaucoup de texte qui contient des adresses de sites Web et des adresses électroniques. L’analyseur standard ne les separerait pas correctement; Par exemple, si vous prenez l’exemple d’adresse électronique john.smith@example.com et que vous l’analysez avec le tokenizer standard, il est divisé en plusieurs jetons:

Les tokens sont john.smith et exemple.com.

Ici, vous voyez qu’il a été divisé en deux parties: john.smith et example.com. Il divise également les URL en parties distinctes:

Les jetons sont http, example.com, q et foo.

Le tokenizer d’email URL UAX conservera les courriers électroniques et les URL sous forme de jetons uniques:

Cela peut être extrêmement utile lorsque vous souhaitez rechercher des URL ou des adresses électroniques exactes dans un champ de texte. Dans ce cas, nous avons inclus la réponse pour indiquer que le type des champs est également défini sur email et url.

Hiérarchie des chemins
Le tokenizer path hierarhy vous permet d’indexer les chemins des systèmes de fichiers de manière à ce que la recherche de fichiers partageant le même chemin renvoie des résultats. Par exemple, supposons que vous souhaitez indexer un nom de fichier qui ressemble à /usr/local/var/log/elasticsearch.log. Voici le resultat:

Les tokens sont / usr, / usr / local, / usr / local / var, / usr / local / var / log et /usr/local/var/log/elasticsearch.log.

Cela signifie qu’un utilisateur recherchant un fichier partageant la même hiérarchie de chemins (d’où son nom!) que ce fichier trouvera une correspondance. Les requêtes sur « /usr/local/var/log/es.log » partagent toujours les mêmes jetons que « /usr/local/var/log/elasticsearch.log », de sorte qu’il puisse toujours être renvoyé.

Maintenant que nous avons abordé les différentes manières de diviser un bloc de texte en différents jetons, parlons de ce que vous pouvez faire avec chacun de ces jetons.

5.4.3. Filtres de tokens

Elasticsearch contient de nombreux filtres de token; nous ne couvrirons que les plus populaires dans cette section car les énumérer tous rendrait cette section beaucoup trop verbeuse. Comme dans la figure 5.1, la figure 5.3 fournit un exemple de trois filtres de jetons: le filtre minuscule, le filtre de mots vides et le filtre de synonymes.

Standard
Il ne faut surtout pas penser que le filtre de jetons standard effectue des calculs complexes; Il ne fait rien du tout! Dans les anciennes versions de Lucene, il supprimait les caractères “’ s ”de la fin des mots, ainsi que certains caractères superflus, mais ceux-ci sont maintenant gérés par d’autres filtres de jetons et autres tokenizers.

Minuscule
C’est exactement ce que fait le filtre de jetons minuscules: il met en minuscule tout jeton qui le traverse. C’est plutôt simple à comprendre:

Le jeton est: hi there!.

Longueur
Le filtre de jeton length supprime les mots situés en dehors d’une limite de longueur minimale et maximale. Par exemple, si vous définissez le paramètre minimum sur 2 et le paramètre maximum sur 8, tout jeton de moins de deux caractères sera supprimé et tout jeton de plus de huit caractères sera supprimé:

Vous avez maintenant votre index avec le filtre personnalisé configuré appelé my-length-filter. Dans la requête suivante, vous utilisez ce filtre pour filtrer tous les jetons inférieurs à 2 ou supérieurs à 8.

curl ‘localhost:9200/length/_analyze?tokenizer=standard&filters=my-length-filter&pretty=true’ -d ‘a small word and a longerword’

Les tokens sont: small, world and, and.

Stop
Le filtre de jetons Stop supprime les mots stop(de fin) du flux de jetons. En anglais, cela signifie que tous les jetons de cette liste sont entièrement supprimés. Vous pouvez également spécifier une liste de mots à supprimer pour ce filtre.

Quels sont les mots stop ? Voici la liste par défaut des mots stop pour la langue anglaise:

aanandareasatbebutbyforifinintoisitnonotofonorsuchthatthetheirthentherethesetheythistowaswillwith

Pour spécifier la liste des mots vides, vous pouvez créer un filtre de jeton personnalisé avec une liste de mots comme celle-ci:

Pour lire la liste des mots stop à partir d’un fichier en utilisant un chemin relatif à l’emplacement de configuration ou d’un chemin absolu, chaque mot doit figurer sur une nouvelle ligne et le fichier doit être codé en UTF-8. Vous utiliseriez ce qui suit pour utiliser le filtre de mots stops configurés dans un fichier:

Une dernière option consisterait à utiliser une liste de mots stop prédéfinie dans un langage. Dans ce cas, la valeur pour les mots vides pourrait être «_dutch_» ou l’une des autres langues prédéfinies.

Troncate, trim et limiter le nombre de jetons
Les trois filtres de jetons suivants traitent de la limitation du flux de jetons:

  • Le filtre de jeton troncate vous permet de tronquer des jetons sur une certaine longueur en définissant le paramètre de longueur dans la configuration personnalisée; par défaut, il est tronqué à 10 caractères.
  • Le filtre de jeton trim supprime tous les espaces autour d’un jeton. par exemple, le jeton  » foo » sera transformé en jeton foo.
  • Le filtre de jeton de limit token count limite le nombre maximal de jetons qu’un champ particulier peut contenir. Par exemple, si vous créez un filtre de nombre de jetons personnalisé avec une limite de 8, seuls les huit premiers jetons du flux seront indexés. Ce paramètre est défini à l’aide du paramètre max_token_count, dont la valeur par défaut est 1 (un seul jeton sera indexé).

Sens inverse
Le filtre de jeton reverse vous permet de prendre un flux de jetons et de les inverser. Ceci est particulièrement utile si vous utilisez le filtre Edge Ngram ou si vous souhaitez effectuer en premier plan des recherches génériques. Au lieu d’effectuer une recherche générique de premier plan sur «* bar», ce qui est très lent pour Lucene, vous pouvez effectuer une recherche à l’aide de «rab *» sur un champ qui a été inversé, ce qui entrainera une interrogation beaucoup plus rapide. La figure suivante montre un exemple d’inversion de flux de jetons.

Vous pouvez voir que chaque jeton a été inversé, mais l’ordre des jetons a été préservé.

Unique
Le filtre de jeton unique ne conserve que des jetons uniques; il conserve les métadonnées du premier jeton qui correspond, en supprimant toutes les occurrences futures:

Ascii pliant
Le filtre de jeton ascii folding convertit les caractères Unicode qui ne font pas partie du jeu de caractères ASCII normal en leur équivalent ASCII, s’il en existe un pour le caractère. Par exemple, vous pouvez convertir le “ü” Unicode en un “u” ASCII, comme indiqué ici:

Synonyme
Le filtre de jeton synonyme remplace les synonymes pour les mots du flux de jetons au même endroit. Par exemple, prenons le texte «I own that automobile» et le synonyme «automobile», «car». Sans le filtre de jetons de synonymes, vous produiriez les jetons suivants:

Vous pouvez définir un analyseur personnalisé qui spécifie un synonyme de «automobile» comme ceci:

Lorsque vous l’utilisez, vous pouvez voir que le jeton automobile a été remplacé par le jeton car dans les résultats:

Dans l’exemple, vous configurez le filtre de synonyme pour remplacer le token, mais il est également possible d’ajouter le jeton de synonyme aux jetons existant du filtre. Dans ce cas, vous devez remplacer automobile=> car par automobile, car.

5.5. NGRAMS, NGRAMS DE BORD ET ZONA

Les ngrams et les ngrams Edge sont deux des moyens les plus uniques de marquer un texte dans Elasticsearch. Les ngrams sont un moyen de diviser un token en plusieurs sous-ensembles pour chaque partie d’un mot. Les filtres ngram et edge ngram vous permettent de spécifier un paramètre min_gram et max_gram. Ces paramètres contrôlent la taille des jetons dans lesquels le mot est divisé. Cela peut prêter à confusion, alors voyons un exemple. Si vous souhaitez analyser le mot «spaghetti» avec l’analyseur ngram, commençons par le cas le plus simple, 1 gramme (également appelé unigramme).

5.5.1. 1-grams

Les 1-grams pour les «spaghettis» sont: s, p, a, g, h, e, t, t, i. La chaîne a été divisée en plus petits jetons en fonction de la taille du ngram. Dans ce cas, chaque élément est un charactère unique car nous parlons d’unigrammes.

5.5.2. Bigrams

Si vous divisez la chaîne en bigrams (ce qui correspond à une taille de deux), vous obtiendrez les plus petits jetons suivants: sp, pa, ag, gh, he, et, tt, ti.

5.5.3. Trigrammes

Encore une fois, si vous utilisiez une taille de trois (appelés trigrammes), vous auriez les jetons spa, pag, agh, ghe, het, ett, tti.

5.5.4. Définition de min_gram et max_gram

Lors de l’utilisation de cet analyseur, vous devez définir deux tailles différentes: l’une spécifie les plus petits ngrams que vous souhaitez générer (paramètre min_gram) et l’autre, les plus grands ngrams à générer. En utilisant l’exemple précédent, si vous spécifiez un min_gram de 2 et un max_gram de 3, vous obtiendrez les jetons combinés de nos deux exemples précédents:

Si vous définissez le paramètre min_gram sur 1 et si vous laissez max_gram à 3, vous obtiendrez encore plus de jetons, en commençant par s, sp, spa, p, pa, pag, a, ….

Analyser le texte de cette manière présente un avantage intéressant. Lorsque vous interrogez du texte, votre requête sera divisée en texte de la même manière. Supposons que vous recherchez le mot mal orthographié «spaghety». Une façon de le faire consiste à effectuer une requête floue(fuzzy), qui vous permet de spécifier un pattern afin de vérifier les correspondances. Mais vous pouvez obtenir un comportement similaire en utilisant ngrams. Comparons les bigrammes générés pour le mot original («spaghetti») avec le mot mal orthographié («spaghety»):

  • Bigrams pour “spaghetti”: sp, pa, ag, gh, he, et, tt, ti
  • Bigrams pour “spaghety”: sp, pa, ag, gh, he, et, ty

Vous pouvez voir que six des jetons se chevauchent. Par conséquent, les mots comportant «spaghetti» sont toujours identiques lorsque la requête contient «spaghety». N’oubliez pas que cela signifie aussi que davantage de mots dont vous ne vous doutez même pas correspondent aussi «spaghetti» d’origine, alors assurez-vous toujours de tester la pertinence de votre requête!

Une autre chose utile que ngrams vous permet faire, c’est d’analyser du texte lorsque vous ne connaissez pas la langue à l’avance ou lorsque vous avez des langues qui combinent les mots de manière différente de celle des autres langues européennes. Cela présente également l’avantage de pouvoir gérer plusieurs langues avec un seul analyseur, plutôt que de devoir spécifier différents analyseurs ou d’utiliser différents champs pour les documents dans différentes langues.

5.5.5. ngrams de bord (Edge)

Une variante de la division en ngrams régulière, appelée ngrams de bord, construit des ngrams uniquement à partir du bord avant. Dans l’exemple «spaghetti», si vous définissez le paramètre min_gram sur 2 et le paramètre max_gram sur 6, vous obtiendrez les jetons suivants:

Vous pouvez voir que chaque jeton est construit à partir du bord. Cela peut être utile pour rechercher des mots partageant le même préfixe sans effectuer une requête de type préfixe. Si vous avez besoin de construire des ngrams à partir de la fin d’un mot, vous pouvez utiliser la propriété side pour prendre le bord de l’arrière au lieu du front par défaut.

5.5.6. Paramètres Ngram

Les ngrams s’avèrent être un excellent moyen d’analyser du texte lorsque vous ne connaissez pas la langue car ils peuvent analyser des langues ne comportant pas d’espace entre les mots. Un exemple de configuration d’un analyseur de bord avec des minimum et maximum ressemblerait à la figure suivante.

5.5.7. Zona (Shingle)

Dans le même ordre d’idées que les ngrams et les ngrams de bord, il existe un filtre appelé filtre Zona (non, pas la maladie!). Le filtre de jeton zona est fondamentalement ngrams au niveau du jeton au lieu d’un charactère

Pensez à notre mot préféré, «spaghetti». En utilisant des ngrammes avec un minimum et un maximum réglés sur 1 et 3, Elasticsearch générera les jetons s, sp, spa, p, pa, pag, a, ag, etc. Un filtre Zona (Shingle) effectue cela au niveau des jetons à la place. Par conséquent, si vous aviez le texte «foo bar baz» et utilisiez, là encore, un min_shingle_size de 2 et un max_shingle_size de 3, vous généreriez les jetons suivants:

Pourquoi la sortie à un seul jeton est-elle toujours incluse? En effet, par défaut, le filtre shingles inclut les jetons d’origine. Le tokenizer d’origine génère donc les jetons foo, bar et baz, qui sont ensuite transmis au filtre de jetons shingle, qui génère à son tour les jetons foo bar, foo bar baz et bar. baz. Tous ces jetons sont combinés pour former le flux de jetons final. Vous pouvez désactiver ce comportement en définissant l’option output_unigrams sur false.

La figure suivante montre un exemple de filtre de jeton shingle; notez que l’option min_shingle_size doit être supérieure ou égale à 2.

5.6 Stemming(Recherche de racine)

La recherche de racine est l’acte de réduire un mot à son mot de base ou racine. C’est extrêmement pratique lorsque vous effectuez une recherche car cela signifie que vous pouvez associer des éléments tels que le pluriel d’un mot ainsi que des mots partageant la racine ou la tige du mot (d’où le nom qui en découle). Regardons un exemple concret. Si le mot est «administrations», la racine du mot est «admin». Cela vous permet de faire correspondre toutes les autres racines de ce mot, comme «administrateur», «administration» et «administrer».Le stemming est une puissante manière de rendre vos recherches plus souples que l’appariement exact et rigide.

5.6.1. Algorithme de stemming

L’algorithme de stemming est appliqué à l’aide d’une formule ou d’un ensemble de règles pour chaque jeton. Elasticsearch propose actuellement trois stemmers différents: le filtre snowball, le filtre porter_stem et le filtre kstem. Ils se comportent presque de la même manière mais présentent quelques légères différences d’agressivité lors du stemming. Par agressif, nous entendons que les stemmers plus agressifs couperont plus le mot que ceux qui le sont moins. Le tableau 5.1 montre une comparaison des différents stemmers.

Pour voir comment un stemmer identifie le radical pour un mot, vous pouvez aussi facilement le définir en tant que filtre de token avec l’API d’analyse:

Utilisez snowball, porter_stem ou kstem pour que le filtre le teste.

En guise d’alternative aux algorithmes de stemming, vous pouvez utiliser un dictionnaire, qui est une correspondance directe entre le mot original et sa racine.

5.6.2. Le stemming avec un dictionnaire

Parfois, les stemmers peuvent retourner des mots de façon étrange parce qu’ils ne connaissent pas la langue sous-jacente. Pour cette raison, il existe un moyen plus précis de contourner ce problème en utilisant un dictionnaire de mots. Dans Elasticsearch, vous pouvez utiliser le filtre de jeton hunspell, associé à un dictionnaire, pour gérer le stemming. De ce fait, la qualité de la suppression est directement liée à la qualité du dictionnaire que vous utilisez. Le stemmer ne pourra utiliser que les mots du dictionnaire.

Lors de la création d’un analyseur hunspell, les fichiers du dictionnaire doivent figurer dans un répertoire appelé hunspell, situé dans le même répertoire que elasticsearch.yml. Dans le dictionnaire de répertoire hunspell de chaque langue, il devrait y avoir un dossier nommé d’après les paramètres régionaux qui lui sont associés. Voici comment créer un index avec un analyseur Hunspell:

Les fichiers dudictionnaire hunspell doivent être situés dans <répertoire-es-config> / hunspell / en_US (remplacez <répertoire-config> par l’emplacement de votre répertoire de configuration Elasticsearch). Le dossier en_US est utilisé car cet analyseur hunspell est destiné à la langue anglaise et correspond aux paramètres régionaux de l’exemple précédent. Vous pouvez également modifier l’emplacement dans lequel Elasticsearch recherche les dictionnaires hunspell en définissant le paramètre index.analysis .hunspell.dictionary.location dans elasticsearch.yml. Pour vérifier que votre analyseur fonctionne correctement, vous pouvez utiliser à nouveau l’API d’analyse:

5.6.3. Ecraser le stemming d’un filtre de token

Parfois, il est possible que vous ne souhaitiez pas que les mots soient stemmés (remplacer par leur radicals), soit parce que le stemmer les traite de manière incorrecte, soit que vous souhaitez effectuer des correspondances exactes pour un mot particulier. Vous pouvez y parvenir en plaçant un filtre de jeton keyword marker (marqueur de mot clé) avant le filtre d’origine dans la chaîne de filtres de jetons. A l’intèrieur de ce dernier , vous pouvez spécifier une liste de mots ou un fichier contenant une liste de mots qui ne doivent pas être stemmés.

Outre l’empêchement d’un mot d’être stemmé, il peut être utile de spécifier manuellement une liste de règles à utiliser pour le stemming de certains mots. Vous pouvez y parvenir avec le filtre de jeton stemmer override, qui vous permet de spécifier des règles telles que cats => cat à appliquer. Si il  trouve une règle et l’applique à un mot, ce mot ne peut pas être stemmé par un autre stemmer.

N’oubliez pas que ces deux filtres de jetons doivent être placés avant tout autre filtre, car ils empêcheront le terme d’être traité par d’autres filtres de jetons plus tard dans la chaîne.

5.7 RÉSUMÉ

Vous devez maintenant comprendre comment Elasticsearch sépare le texte d’un champ avant l’indexation ou la recherche. Le texte est divisé en différents jetons, puis des filtres sont appliqués pour créer, supprimer ou modifier ces jetons:

  • L’analyse consiste à créer des jetons à partir du texte dans les champs de vos documents. Le même processus est appliqué à votre chaîne de recherche dans des requêtes telles que la query match. Un document correspond lorsque ses jetons correspondent aux jetons de la chaîne de recherche.
  • Un analyseur est attribué à chaque champ via le mapping. Cet analyseur peut être défini dans la configuration d’Elasticsearch ou dans les paramètres d’index, ou il peut s’agir d’un analyseur par défaut.
  • Les analyseurs sont des chaînes de traitement constituées par un générateur de jetons(tokenizer), qui peuvent être précédées d’un ou plusieurs filtres de caractères et remplacées par un ou plusieurs filtres de jetons.
  • Les filtres Char sont utilisés pour traiter les chaînes avant de les transmettre au tokenizer. Par exemple, vous pouvez utiliser ce filtre pour remplacer «&» par «et».
  • Les tokenizers sont utilisés pour briser des chaînes en plusieurs jetons. Par exemple, le tokenizer d’espace peut être utilisé pour faire un jeton à partir de chaque mot délimité par un espace.
  • Les filtres de jetons sont utilisés pour traiter les jetons provenant du tokenizer. Par exemple, vous pouvez utiliser l’option stemming pour réduire un mot à sa racine et faire en sorte que vos recherches fonctionnent avec les versions au pluriel et au singulier de ce mot.
  • Les filtres de jetons Ngram créent des jetons à partir de portions de mots. Par exemple, vous pouvez créer un jeton toutes les deux lettres consécutives. Ceci est utile lorsque vous souhaitez que vos recherches fonctionnent même si la chaîne de recherche contient des fautes de frappe.
  • Les ngrammes Edge sont comme les ngrams, mais ils ne fonctionnent que depuis le début ou la fin du mot. Par exemple, vous pouvez prendre «événement» et créer des jetons e, ev et eve.
  • Les Shingles (Zona) sont comme des ngrammes à l’échelle d’une phrase. Par exemple, vous pouvez générer des termes à partir de deux mots consécutifs d’une phrase. Ceci est utile lorsque vous souhaitez renforcer la pertinence des correspondances de plusieurs mots, comme dans la brève description d’un produit. Nous parlerons davantage de la pertinence dans le prochain chapitre.