Qu'est-ce que l'index inversé? Il est bien connu que vous devez créer des index pour implémenter des recherches efficaces. Quelle est la différence entre index et index inversé, et comment construire un index inversé?


Réponse 1:

Index inversé

La recherche élastique utilise une structure appelée index inversé, conçue pour permettre des recherches en texte intégral très rapides. Un index inversé consiste en une liste de tous les mots uniques qui apparaissent dans n'importe quel document, et pour chaque mot, une liste des documents dans lesquels il apparaît.

Par exemple, supposons que nous ayons deux documents, chacun avec un champ de contenu contenant les éléments suivants:

  1. Le renard brun rapide a sauté par-dessus le chien paresseux

Pour créer un index inversé, nous divisons d'abord le champ de contenu de chaque document en mots séparés (que nous appelons termes ou jetons), créons une liste triée de tous les termes uniques, puis listons dans quel document chaque terme apparaît. Le résultat ressemble à ceci:

Terme Doc_1 Doc_2
-------------------------
Rapide | | X
Le | X |
marron | X | X
chien | X |
chiens | | X
renard | X |
renards | | X
dans | | X
sauté | X |
paresseux | X | X
saut | | X
plus | X | X
rapide | X |
été | | X
le | X |
------------------------

Maintenant, si nous voulons rechercher le brun rapide, il nous suffit de trouver les documents dans lesquels chaque terme apparaît:

Terme Doc_1 Doc_2
-------------------------
marron | X | X
rapide | X |
------------------------
Total | 2 | 1

Les deux documents correspondent, mais le premier document a plus de correspondances que le second. Si nous appliquons un algorithme de similitude naïf qui ne compte que le nombre de termes correspondants, nous pouvons dire que le premier document est une meilleure correspondance - est plus pertinent pour notre requête - que le deuxième document.

Mais il y a quelques problèmes avec notre index inversé actuel:

  • Rapide et rapide apparaissent comme des termes séparés, tandis que l'utilisateur les considère probablement comme le même mot. Le renard et le renard sont assez similaires, tout comme le chien et les chiens; Ils partagent le même mot racine. Saut et saut, sans être du même mot racine, ont un sens similaire. Ce sont des synonymes.

Avec l'index précédent, une recherche de + Quick + fox ne correspondrait à aucun document. (Souvenez-vous, un + précédent signifie que le mot doit être présent.) Le terme Quick et le terme fox doivent être dans le même document afin de satisfaire la requête, mais le premier doc contient quick fox et le second doc contient Quick renards.

Notre utilisateur pouvait raisonnablement s'attendre à ce que les deux documents correspondent à la requête. On peut faire mieux.

Si nous normalisons les termes dans un format standard, nous pouvons trouver des documents qui contiennent des termes qui ne sont pas exactement les mêmes que ceux demandés par l'utilisateur, mais qui sont suffisamment similaires pour être toujours pertinents. Par exemple:

  • Quick peut être minuscule pour devenir quick.foxes peut être dérivé - réduit à sa forme racinaire - pour devenir renard. De même, les chiens peuvent être issus de dog.jumped et jump sont des synonymes et peuvent être indexés comme un seul terme.

Maintenant, l'index ressemble à ceci:

Terme Doc_1 Doc_2
-------------------------
marron | X | X
chien | X | X
renard | X | X
dans | | X
sauter | X | X
paresseux | X | X
plus | X | X
rapide | X | X
été | | X
le | X | X
------------------------

Mais nous n'en sommes pas encore là. Notre recherche de + Quick + fox échouerait toujours, car nous n'avons plus le terme exact Quick dans notre index. Cependant, si nous appliquons les mêmes règles de normalisation que nous avons utilisées sur le champ de contenu à notre chaîne de requête, cela deviendrait une requête pour + quick + fox, qui correspondrait aux deux documents!

Remarque: - Ceci est très important. Vous ne pouvez trouver que les termes qui existent dans votre index. Le texte indexé et la chaîne de requête doivent donc être normalisés dans le même formulaire.

Référence: le guide définitif [2.x] | Élastique


Réponse 2:

En termes simples, il s'agit d'une structure de données semblable à une table de hachage qui vous dirige d'un mot vers un document ou une page Web.

Regardons le problème dans une autre direction. Vous avez des millions de documents ou de pages Web ou d'images tout ce que nous pourrions avoir besoin de récupérer plus tard. Pour vous aider davantage dans votre intuition concernant l'indexation et la récupération d'informations à l'aide de celui-ci, je vous rappelle que vous avez déjà vu un index inversé.

Ceci est un exemple tiré d'un manuel aléatoire. Si vous avez besoin d'informations sur un sujet, par exemple, les énergies d'activation, vous ouvrirez l'index et découvrirez ce mot. L'index inversé vous indiquera les numéros de page où ce mot est expliqué dans un gros volume de mille pages.

Tu vois! Si vous deviez effectuer une recherche linéaire régulière, vous mettrez des heures à atteindre cette page. Mais maintenant, ce n'était plus qu'une question de secondes.

Alors à quoi ressemble un index régulier?

Bien sûr, juste en face. Il associe le numéro de page aux sujets. Et vous pouvez facilement dire qu'ils ne sont pas si utiles dans le domaine de la recherche et de l'extraction d'informations. (Peut-être qu'ils ont de la chance ailleurs). En cas de recherche sur Facebook, ils sont utilisés à des fins de classement (notation) afin que vous obteniez les résultats les plus pertinents plus haut.

Comment construire un index inversé? La construction d'un index inversé pour maintenir tout type de système de recherche vous oblige à effectuer une série d'étapes lors de l'analyse des pages ou des documents. Passons en revue la construction de notre propre moteur de recherche.

Je veux créer un moteur de recherche pour tous les documents de mon ordinateur. Je sais ce que je cherche. Je vais donc exécuter un programme qui parcourra toute l'arborescence de mes disques durs et collectera les pages que je veux. Je sais que les fichiers mp3 et jpeg ne me sont d'aucune utilité. Je vais demander à mon programme de récupérer les fichiers txt, doc et pdf. Donc, une fois que j'ai reçu un document, je passe à l'étape suivante.

1. Récupération du document Le travail est vraiment simple si j'obtiens un fichier texte (.txt). Mais s'il s'agissait d'un doc ou d'un pdf, je devrai les analyser à l'aide de certaines bibliothèques pour récupérer leur texte. Disons que j'ai réussi à lire le texte. Et ensuite?

2. Suppression des mots videsConsidérez le dernier paragraphe. Quels sont les mots importants que nous recherchons peut-être? "texte", "bibliothèques", "doc", "pdf", "récupérer", "réussi". Mais la plupart des autres mots ne sont qu'un gaspillage. Nous désignons les mots les plus courants comme des "mots vides" et les supprimons afin que je n'obtienne pas d'index pour des mots comme "je", "le", "nous", "est", "un". En utilisation régulière, nous avons une liste de 500 à 1 000 mots. Mais cela peut différer selon l'utilisation.

3. Stem to the Root Word Puis vient Stemming. Maintenant, chaque fois que je veux rechercher "récupération", je veux voir un document qui contient des informations à ce sujet. Mais le mot présent dans le document est appelé "récupérer" au lieu de "récupérer". Pour relier les deux mots, je vais couper une partie de chaque mot que je lis afin de pouvoir obtenir le "mot racine". Récupérer peut devenir "récupérer". Il en sera de même pour la «récupération». Nous devons être sûrs des règles que nous utilisons pour couper les mots. Il existe des outils standard pour effectuer cela, comme "Porter's Stemmer". Vous pouvez jouer avec un porteur stemmer ici: Porter Stemmer Online

4. Enregistrez les ID de document Préparez-vous maintenant à la tâche principale - Indexation. Chaque document que j'ai possède un identifiant de document unique. Comme je rencontre un mot non-stop qui provient maintenant, je l'enregistre dans ma mémoire sous la forme: retriev ==> docID104007

Si j'obtiens le même mot dans un autre document, je peux writeretriev ==> docID104007retriev ==> docID154033

Mais très bientôt, je dois les combiner en une seule lecture ==> docID104007 & docID154033

Je peux encore améliorer en écrivant combien de fois le mot s'est produit dans le document afin que nous puissions classer les documents les plus importants lors de la récupération. retriev ==> docID104007 | 5 | & docID154033 | 2 |

5. Fusionnez et stockez les conditions Enfin, nous les enregistrons toutes dans des fichiers disque. C'est génial si nous trions l'index en fonction des mots pour une récupération rapide et facile.

Tout cela a évidemment besoin de structures de données spécifiques qui simplifient votre travail.

Nous pouvons construire d'autres index secondaires pour améliorer la récupération. Il y a aussi beaucoup de problèmes liés au classement.

J'espère que cela vous a expliqué comment sont créés les index inversés. Si vous voulez en savoir plus, vous pouvez vous référer à un livre génial Introduction à la recherche d'informations écrit par Chris Manning, disponible en ligne gratuitement.