Solr est un serveur d'applications de recherche de niveau d'entreprise indépendant qui fournit une interface API de type Web. Les utilisateurs peuvent soumettre des fichiers XML d'un certain format vers le serveur de moteur de recherche via les demandes HTTP et générer des index; Ils peuvent également soumettre des demandes de recherche via HTTP Get Operations et obtenir le résultat de retour au format XML / JSON. Développé à l'aide de Java5, basé sur Lucene.
Lucene est un sous-projet de l'équipe de projet Jakarta de la Fondation des logiciels Apache. Il s'agit d'une boîte à outils de moteur de recherche en texte complet open source, c'est-à-dire qu'il ne s'agit pas d'un moteur de recherche complet en texte complet, mais d'une architecture de moteur de recherche en texte complet, fournissant un moteur de requête complet et un moteur d'index, et un moteur d'analyse de texte partiel (anglais et langues occidentales allemandes).
Parmi eux, les principes de base de la recherche en texte intégral de Lucene sont conformes à la technologie du cours de recherche Web enseigné par Guo Jundaniu. Il utilise la segmentation des mots, l'analyse de grammaire sémantique, le modèle d'espace vectoriel et d'autres technologies pour y parvenir. Ce qui suit est un article de blog plus détaillé Mémo: http://www.cnblogs.com/guochunguang/articles/3641008.html
1. Discussion générale
Définition selon http://lucene.apache.org/java/docs/index.html:
Lucene est une bibliothèque de recherche en texte intégral efficace et basée sur Java.
Donc, avant de comprendre Lucene, vous devez prendre un peu de temps pour en savoir plus sur la recherche en texte intégral.
Alors, qu'est-ce que la recherche en texte intégral? Cela commence par les données de nos vies.
Les données de notre vie sont généralement divisées en deux types: des données structurées et des données non structurées.
• Données structurées: fait référence aux données avec un format fixe ou une longueur finie, telles que des bases de données, des métadonnées, etc.
• Données non structurées: fait référence à des données avec une longueur incertaine ou pas de format fixe, tels que des e-mails, des documents Word, etc.
Bien sûr, certains endroits mentionneront également le troisième type, des données semi-structurées, telles que XML, HTML, etc., lorsqu'elles peuvent être traitées en fonction des données structurées, ou du texte brut peut être extrait pour traiter comme des données non structurées.
Les données non structurées sont également appelées données en texte intégral.
Selon la classification des données, les recherches sont également divisées en deux types:
• Recherchez des données structurées: par exemple, la recherche de bases de données, utilisez des instructions SQL. Par exemple, la recherche de métadonnées, telles que l'utilisation de la recherche Windows pour rechercher les noms de fichiers, les types, le temps de modification, etc.
• Rechercher des données non structurées: par exemple, la recherche de Windows peut également rechercher le contenu de fichier, la commande grep sous Linux, et par exemple, l'utilisation de Google et Baidu peut rechercher une grande quantité de données de contenu.
Il existe deux méthodes principales pour rechercher des données non structurées, c'est-à-dire des données en texte intégral:
L'une est la numérisation série: le soi-disant numérisation séquentielle, par exemple, à la recherche d'un fichier avec une certaine chaîne, est de regarder chaque document à la fois. Pour chaque document, voir du début à la fin. Si ce document contient cette chaîne, ce document est le fichier que nous recherchons, puis examinez le fichier suivant jusqu'à ce que tous les fichiers soient analysés. Si vous utilisez Windows pour rechercher, vous pouvez également rechercher du contenu de fichier, mais c'est assez lent. Si vous avez un disque dur de 80 g, si vous souhaitez trouver un fichier avec une certaine chaîne dessus, il a peur de ne pas pouvoir le faire sans passer quelques heures. C'est également la même manière pour les commandes GREP sous Linux. Vous pouvez penser que cette méthode est relativement primitive, mais pour les fichiers avec de petits volumes de données, cette méthode est toujours la plus directe et la plus pratique. Mais pour un grand nombre de fichiers, cette méthode est très lente.
Certaines personnes peuvent dire que la numérisation séquentielle des données non structurées est très lente, mais la recherche de données structurées est relativement rapide (car les données structurées ont une certaine structure, un certain algorithme de recherche peut être utilisé pour accélérer la vitesse), donc n'est-ce pas suffisant pour trouver un moyen de faire en sorte que nos données non structurées aient une certaine structure?
Cette idée est naturelle, mais elle forme l'idée de base de la recherche en texte intégral, qui consiste à extraire une partie des informations dans les données non structurées et à la réorganiser pour la faire avoir une certaine structure, puis à rechercher les données avec une certaine structure, afin d'atteindre le but de la recherche relativement rapidement.
Cette partie des informations extraites des données non structurées puis réorganisées est appelée index.
Cette déclaration est relativement abstraite, et elle est facile à comprendre en donnant quelques exemples. Par exemple, le dictionnaire, la table Pinyin et le tableau des caractères de vérification radicale du dictionnaire sont équivalents à l'indice du dictionnaire. L'explication de chaque caractère n'est pas structurée. Si le dictionnaire n'a pas de table de syllabes et de table de caractéristiques de vérification radicale, vous ne pouvez le scanner que dans la vaste mer de mots. Cependant, certaines informations sur le mot peuvent être extraites pour un traitement structuré. Par exemple, la prononciation est relativement structurée, divisée en initiales et finales, et il n'y a que quelques types qui peuvent être répertoriés un par un. Par conséquent, la prononciation est retirée et disposée dans un certain ordre, et chaque prononciation pointe vers le nombre de pages de l'explication détaillée de ce mot. Lorsque nous recherchons, nous recherchons la prononciation selon le pinyin structuré, puis nous pouvons trouver nos données non structurées - c'est-à-dire l'explication des mots.
Ce processus de création d'abord d'un index, puis de recherche de l'index est appelé recherche de texte intégral.
L'image ci-dessous provient de "Lucene en action", mais elle décrit non seulement le processus de recherche de Lucene, mais décrit également le processus général de la recherche en texte intégral.
La recherche en texte complet est généralement divisée en deux processus: la création d'index (indexation) et l'index de recherche (recherche).
• Création d'index: processus d'extraction d'informations de toutes les données structurées et non structurées dans le monde réel et de création d'un index.
• Index de recherche: il s'agit du processus d'obtention de la demande de requête de l'utilisateur, de recherche de l'index créé, puis de renvoyer le résultat.
Par conséquent, il y a trois problèmes importants dans la recherche en texte intégral:
1. Qu'est-ce qui existe exactement dans l'index? (Indice)
2. Comment créer un index? (Indexage)
3. Comment rechercher des index? (Recherche)
Ci-dessous, nous étudions chaque problème en séquence.
2. Ce qui existe exactement dans l'index
Qu'est-ce qui doit être stocké exactement dans l'index?
Tout d'abord, voyons pourquoi la vitesse de balayage séquentielle est lente:
En fait, il est causé par l'incohérence entre les informations que nous souhaitons rechercher et les informations stockées dans les données non structurées.
Les informations stockées dans des données non structurées sont ce que contient chaque fichier, c'est-à-dire des fichiers connus, et il est relativement facile de rechercher des chaînes, c'est-à-dire le mappage du fichier à la chaîne. Les informations que nous souhaitons rechercher sont quels fichiers contiennent cette chaîne, c'est-à-dire une chaîne connue et le fichier souhaité, c'est-à-dire le mappage de la chaîne au fichier. Les deux sont exactement le contraire. Par conséquent, si l'index peut toujours enregistrer le mappage de la chaîne au fichier, la vitesse de recherche sera considérablement améliorée.
Étant donné que le mappage d'une chaîne à un fichier est un processus inversé du fichier à un mappage de chaîne, l'index qui stocke ces informations est appelé index inversé .
Les informations enregistrées de l'indice inverse sont généralement les suivantes:
Supposons qu'il y ait 100 documents dans ma collection de documents. Par souci de commodité, nous comptons le document de 1 à 100 et obtenons la structure suivante.
À gauche se trouve une série de chaînes appelées dictionnaires .
Chaque chaîne pointe vers une liste liée au document contenant cette chaîne, qui s'appelle une liste de publication .
Avec l'indexation, les informations enregistrées sont conformes aux informations à rechercher, ce qui peut considérablement accélérer la recherche.
Par exemple, si nous voulons trouver un document qui contient à la fois la chaîne "Lucene" et la chaîne "solr", nous n'avons besoin que des étapes suivantes:
1. Supprimez la liste des liens de document contenant la chaîne "Lucene".
2. Supprimez la liste des liens de document contenant la chaîne "solr".
3. En combinant la liste liée, recherchez des fichiers qui contiennent à la fois "Lucene" et "Solr".
En voyant cet endroit, certaines personnes peuvent dire que la recherche en texte intégral accélère la recherche, mais avec le processus d'indexation supplémentaire, les deux peuvent ne pas être beaucoup plus rapides que la numérisation séquentielle. En effet, avec le processus d'indexation, la récupération de texte intégral n'est pas nécessairement plus rapide que la numérisation séquentielle, en particulier lorsque le volume de données est faible. La création d'un index sur une grande quantité de données est également un processus très lent.
Cependant, il y a toujours une différence entre les deux. La numérisation séquentielle est un scan à chaque fois, et le processus de création d'un index ne doit être qu'une seule fois. Chaque recherche, le processus de création d'un index n'a pas à passer par la recherche de l'index créé.
C'est également l'un des avantages de la recherche en texte complet sur la numérisation séquentielle: indexation une fois, en utilisant plusieurs fois.
3. Comment créer un index
Le processus de création d'index de la recherche en texte complet a généralement les étapes suivantes:
Étape 1: Quelques documents originaux à indexer (documents).
Pour faciliter l'explication du processus de création d'index, nous utilisons ici deux fichiers comme exemples:
Déposez-vous un: les étudiants doivent être autorisés à sortir avec leurs amis, mais pas autorisés à boire de la bière.
Fichier 2: Mon ami Jerry est allé à l'école pour voir ses élèves mais les a trouvés ivres, ce qui n'est pas autorisé.
Étape 2: Passez le document d'origine au tokenizer.
Le mot de participais du mot (tokenizer) fera les choses suivantes (ce processus est appelé tokenize):
1. Divisez le document en mots séparés.
2. Retirez les marques de ponctuation.
3. Supprimez le mot d'arrêt.
Le mot ce que l'on appelle le mot d'arrêt est parmi les mots les plus courants d'une langue. Puisqu'il n'a pas de signification particulière, il ne peut pas être un mot-clé de recherche dans la plupart des cas. Par conséquent, lors de la création d'un index, ce mot sera supprimé et la taille de l'indice sera réduite.
English Stop Word tel que: "Le", "A", "This", etc.
Pour le tokenizer de chaque langue, il y a un ensemble de mots d'arrêt.
Le résultat obtenu après un participe de mot (tokenizer) est appelé un élément de mot.
Dans notre exemple, nous obtenons l'élément de mot suivant (jeton):
"Étudiants", "autorisés", "go", "leur", "amis", "autorisé", "boire", "bière", "mon", "ami", "Jerry", "sont allés", "école", "voir", "ses", "étudiants", "trouvés", "eux", "ivres", "autorisés".
Étape 3: Passez le jeton obtenu au composant de traitement du langage (processeur linguistique).
Le composant de traitement du langage (processeur linguistique) traite principalement des éléments de mot résultant (jetons).
Pour l'anglais, le composant de traitement de la langue (processeur linguistique) fait généralement ce qui suit:
1. Changer en minuscules (minuscules).
2. Réduisez le mot sous forme racine, tels que les "voitures" en "voiture", etc. Cette opération est appelée: entièrement.
3. Convertir les mots en formes racines, telles que "conduites" pour "conduire", etc. Cette opération est appelée lemmatisation.
Similitudes et différences entre la tige et la lemmatisation:
• Symmétrique: la tige et la lemmatisation font toutes deux un vocabulaire une forme racine.
• Les deux méthodes sont différentes:
◦ Le système adopte la méthode de "réduction": "voitures" en "voiture", "conduisant" pour "conduire".
◦Lemmatisation adopte la méthode de "transformation": "conduit" à "conduire", "conduite" pour "conduire".
• Les algorithmes des deux sont différents:
◦ Le système adopte principalement un algorithme fixe pour effectuer cette réduction, tel que la suppression de "S", la suppression de "ing" et l'ajout "E", le changement "ationnel" en "mangé" et le changement de "transmission" en "tion".
◦Lemmatisation utilise principalement la méthode de sauvegarde d'un certain dictionnaire pour faire cette transformation. Par exemple, il y a des mappages de "conduite" à "conduire", "conduit" à "conduire", "am, est, sont" être "dans le dictionnaire. Lorsque vous effectuez une transformation, recherchez simplement le dictionnaire.
• Le tige et la lemmatisation ne sont pas des relations mutuellement exclusives, mais ont des intersections. Certains mots peuvent réaliser la même conversion en utilisant les deux méthodes.
Le résultat d'un processeur linguistique est appelé terme.
Dans notre exemple, après le traitement du langage, le mot (terme) obtenu est le suivant:
"Étudiant", "permettre", "go", "leur", "ami", "permettre", "boire", "bière", "mon", "ami", "jerry", "go", "école", "voir", "son", "étudiant", "trouver", "eux", "boire", "permettre".
C'est précisément en raison des étapes de traitement du langage que la recherche de lecteur peut être recherchée et le lecteur peut également être recherché.
Étape 4: Passez le mot obtenu (terme) au composant d'index (indexeur).
L'indexeur fait principalement ce qui suit:
1. Créez un dictionnaire en utilisant le mot résultant (terme).
Dans notre exemple, le dictionnaire est le suivant:
Terme | ID de document |
Étudiant | 1 |
permettre | 1 |
aller | 1 |
Leur | 1 |
ami | 1 |
permettre | 1 |
Boire | 1 |
bière | 1 |
Mon | 2 |
ami | 2 |
jerry | 2 |
aller | 2 |
école | 2 |
voir | 2 |
son | 2 |
Étudiant | 2 |
Trouver | 2 |
Ils | 2 |
Boire | 2 |
permettre | 2 |
2. Triez le dictionnaire par ordre alphabétique.
Terme | ID de document |
permettre | 1 |
permettre | 1 |
permettre | 2 |
bière | 1 |
Boire | 1 |
Boire | 2 |
Trouver | 2 |
ami | 1 |
ami | 2 |
aller | 1 |
aller | 2 |
son | 2 |
jerry | 2 |
Mon | 2 |
école | 2 |
voir | 2 |
Étudiant | 1 |
Étudiant | 2 |
Leur | 1 |
Ils | 2 |
• La fréquence du document signifie la fréquence du document, indiquant combien de fichiers contiennent ce mot (terme).
• La fréquence signifie la fréquence des mots, ce qui signifie que ce fichier contient plusieurs des mots (terme).
Par conséquent, pour le mot «permettre», il y a deux documents contenant ce mot (terme), il y a donc deux documents suivant la liste de documents après le mot (terme). Le premier élément représente le premier document contenant "Autoriser", c'est-à-dire que le document 1. Dans ce document, "Autoriser" apparaît deux fois, et le deuxième élément représente le deuxième document contenant "Autoriser" est le document 2. Dans ce document, "Autoriser" apparaît une fois.
Jusqu'à présent, l'index a été créé, et nous pouvons rapidement trouver le document que nous voulons à travers.
Et dans le processus, nous avons été surpris de constater que les recherches de "drive", "conduite", "conduites" et "conduites" peuvent également être trouvées. Parce que dans notre index, "conduire", "conduit" et "motivé" seront tous traités à travers le langage et deviendront "drive". Lors de la recherche, si vous entrez "conduite", l'instruction de requête entrée passera également par une à trois étapes ici, puis deviendra une "lecteur" de requête, afin que vous puissiez rechercher le document souhaité.
3. Comment rechercher des index?
Il semble que nous puissions annoncer "Nous avons trouvé la documentation que nous voulons".
Cependant, la question n'était pas terminée, et il a été constaté que ce n'était qu'un aspect de la recherche en texte intégral. N'est-ce pas? Si seulement un ou dix documents contiennent les chaînes que nous interrogeons, nous les avons trouvées. Mais que se passe-t-il s'il y en a mille, voire des milliers? Lequel est le fichier que vous voulez le plus?
Ouvrez Google, par exemple, si vous souhaitez trouver un travail chez Microsoft, vous entrez "Microsoft Job" et vous trouvez un total de 22600 000 résultats renvoyés. Quel grand nombre, c'était un problème que soudain, j'ai trouvé que cela n'avait pas été trouvé, et trop étaient aussi un problème. Avec autant de résultats, comment mettez-vous les plus pertinents en premier?
Bien sûr, Google fait du bon travail, vous trouverez des emplois chez Microsoft en une seule fois. Imaginez à quel point ce serait terrible si les premiers étaient tous "Microsoft fait un bon travail dans l'industrie du logiciel ..."
Comment trouver les énoncés de requête les plus pertinents parmi des milliers de résultats de recherche comme Google?
Comment déterminer la corrélation entre le document recherché et l'énoncé de requête?
Ceci est de retour à notre troisième question: comment rechercher des index?
La recherche est principalement divisée en étapes suivantes:
Étape 1: L'utilisateur entre dans l'instruction de requête.
Les instructions de requête ont une certaine syntaxe, tout comme notre langue ordinaire.
Différentes instructions de requête ont une syntaxe différente, telle que les instructions SQL ont une certaine syntaxe.
La syntaxe de l'instruction de requête varie en fonction de l'implémentation du système de récupération de texte complet. Les plus élémentaires incluent: et, ou non, etc.
Par exemple, l'instruction d'entrée de l'utilisateur: Lucene et appris pas Hadoop.
Expliquez que l'utilisateur veut trouver un document qui contient lunene et appris mais n'inclut pas Hadoop.
Étape 2: effectuer l'analyse lexicale, l'analyse grammaticale et le traitement du langage de l'énoncé de requête.
Étant donné que la déclaration de requête a une syntaxe, il est également nécessaire d'effectuer une analyse grammaticale, une analyse grammaticale et un traitement du langage.
1. L'analyse lexicale est principalement utilisée pour identifier les mots et les mots clés.
Comme dans l'exemple ci-dessus, après l'analyse lexicale, les mots incluent Lucene, Levit, Hadoop et les mots clés incluent et, pas.
Si un mot-clé illégal se trouve dans l'analyse lexicale, une erreur se produira. Par exemple, Lucene AMD a appris, où AMD est impliquée dans l'interrogation en tant que mot ordinaire en raison de l'orthographe de et.
2. L'analyse de syntaxe forme principalement un arbre de syntaxe basé sur les règles grammaticales de l'instruction de requête.
Si vous constatez que l'instruction de requête ne respecte pas les règles de syntaxe, une erreur sera signalée. Si Lucene n'est pas et appris, une erreur se produira.
Comme dans l'exemple ci-dessus, l'arbre de syntaxe formé par Lucene et appris pas Hadoop est le suivant:
3. Le traitement linguistique est presque le même que le traitement du langage pendant l'indexation.
Par exemple, le savant devient appris, etc.
Après la deuxième étape, nous obtenons un arbre de syntaxe traité par la langue.
Étape 3: Recherchez l'index et obtenez des documents qui correspondent à l'arborescence de syntaxe.
Cette étape est divisée en plusieurs petites étapes:
1. Premièrement, dans la table d'index inverse, trouvez la liste des liens de document contenant Lucene, Learn et Hadoop.
2. Deuxièmement, fusionnez les listes liées contenant lunene et apprenez à obtenir une liste liée de document qui contient à la fois Lucene et Learn.
3. Ensuite, effectuez une différence entre cette liste liée et la liste Hadoop liée au document et supprimez le document contenant Hadoop, afin d'obtenir une liste liée au document qui contient à la fois lunene et apprentissage et ne contient pas Hadoop.
4. Cette liste de liens de documents est le document que nous recherchons.
Étape 4: Triez les résultats en fonction de la corrélation entre le document obtenu et l'instruction de requête.
Bien que dans l'étape précédente, nous avons obtenu le document souhaité, les résultats de la requête doivent être triés par leur corrélation avec l'énoncé de requête, et plus ceux sont pertinents, plus ceux sont élevés.
Comment calculer la corrélation entre les documents et les déclarations de requête?
Il est préférable de considérer la déclaration de requête comme un court document et de noter la pertinence entre les documents. Si la corrélation avec les scores élevés est bonne, elle doit être classée en premier.
Alors, comment évaluez-vous la relation entre les documents?
Ce n'est pas une tâche facile. Tout d'abord, jetons un coup d'œil à juger la relation entre les gens.
Tout d'abord, lorsque vous regardez une personne, il y a souvent de nombreux éléments , tels que la personnalité, les croyances, les passe-temps, les vêtements, la taille, la graisse et la minceur.
Deuxièmement , pour la relation entre les personnes, différents éléments ont une importance différente . Le caractère, la croyance et les passe-temps peuvent être plus importants. Les vêtements, la hauteur et la graisse peuvent ne pas être aussi importants. Par conséquent, les personnes ayant une personnalité, des croyances et des passe-temps similaires ou similaires sont plus susceptibles de devenir de bons amis, mais des personnes avec des vêtements, une taille et une graisse différents et de la minceur peuvent également devenir de bons amis.
Par conséquent, lorsque vous jugez la relation entre les gens, nous devons d'abord découvrir quels éléments sont les plus importants pour la relation entre les gens , tels que la personnalité, les croyances et les passe-temps. Deuxièmement, nous devons juger de la relation entre ces éléments de deux personnes , comme une personne a une personnalité joyeuse, l'autre personne a une personnalité extravertie, l'une croit au bouddhisme, l'autre croit en Dieu, l'un aime jouer au basket-ball et l'autre aime jouer au football. Nous avons constaté que les deux sont très positifs en termes de personnalité, de genre en termes de foi et de sports en termes de passe-temps, donc la relation entre eux devrait être très bonne.
Jetons un coup d'œil à la relation entre les entreprises.
Tout d'abord, regardez une entreprise, qui se compose de nombreuses personnes, comme le directeur général, le directeur, le directeur technique, les employés ordinaires, les gardes de sécurité, les portes, etc.
Deuxièmement, différentes personnes ont une importance différente pour la relation entre les entreprises . Les directeurs généraux, les gestionnaires et les directeurs techniques peuvent être plus importants, et les employés ordinaires, les agents de sécurité et les portillons peuvent être moins importants. Donc, si la relation entre les directeurs généraux, les gestionnaires et les directeurs de technologie de deux sociétés est relativement bonne, les deux sociétés sont enclines à avoir une meilleure relation. Cependant, même si un employé ordinaire a une profonde haine avec un employé ordinaire d'une autre entreprise, il est peu probable qu'elle affecte la relation entre les deux sociétés.
Par conséquent, pour juger de la relation entre une entreprise, nous devons d'abord découvrir qui est le plus important pour la relation entre l'entreprise , comme le directeur général, le directeur et le directeur de la technologie. Deuxièmement, nous devons juger de la relation entre ces personnes , ce qui n'est pas aussi bon que les directeurs généraux des deux sociétés, les gestionnaires sont des collègues villageois, et les chefs de technologie sont autrefois des partenaires entrepreneuriaux. Nous avons constaté que la relation entre les deux sociétés est bonne, que le directeur général, le directeur ou le chef de la technologie soit bon, donc la relation entre les deux sociétés devrait être bonne.
Après avoir analysé les deux relations, examinons comment juger la relation entre les documents .
Tout d'abord, un document se compose de nombreux mots (terme) , comme la recherche, le lunene, le texte intégral, ceci, a, quoi, etc.
Deuxièmement, un terme différent a une importance différente pour la relation entre les documents . Par exemple, pour ce document, la recherche, le lunene, le texte intégral est relativement important, ceci, a, ce qui peut être relativement peu important. Donc, si les deux documents contiennent la recherche, le lunene et le texte complet, la corrélation entre ces deux documents est meilleure. Cependant, même si un document contient cela, a, quoi et l'autre document ne contient pas cela, a, quoi, il ne peut pas affecter la corrélation entre les deux documents.
Par conséquent, pour juger de la relation entre les documents, découvrez d'abord quels mots (terme) sont les plus importants pour la relation entre les documents, tels que la recherche, le lucene, le texte complet. Ensuite, jugez la relation entre ces mots (terme).
Le processus de découverte de l'importance d'un mot (terme) à un document est appelé le processus de calcul du poids d'un mot.
Il y a deux paramètres pour calculer le terme poids. Le premier est le mot (terme) et le second est le document (document).
Le poids d'un mot indique l'importance de ce mot dans ce document. Plus le mot (terme) est important, plus le poids (poids du terme) est important, et donc il jouera un rôle plus important dans le calcul de la corrélation entre les documents.
Le processus de jugement de la relation entre les mots (terme) et donc l'obtention de corrélations de documents est utilisé pour utiliser un algorithme de modèle d'espace vectoriel (modèle d'espace vectoriel).
Analysons attentivement ces deux processus:
1. Le processus de calcul du poids (poids à terme).
Il existe deux principaux facteurs qui influencent l'importance d'un mot (terme) dans un document:
• Fréquence du terme (TF): c'est combien de fois ce terme apparaît-il dans ce document. Plus le TF est grand, plus cela signifie important.
• Fréquence du document (DF): c'est-à-dire combien de documents contiennent un terme secondaire. Plus le DF est grand, moins cela signifie important.
Est-ce facile à comprendre? Plus le mot (terme) apparaît dans le document, plus il est important pour le document. Par exemple, le mot «recherche» apparaît plusieurs fois dans ce document, ce qui signifie que ce document parle principalement de cet aspect. Cependant, dans un document anglais, si cela apparaît plus souvent, cela signifie-t-il qu'il est plus important? Non, cela est ajusté par le deuxième facteur. Le deuxième facteur montre que plus les documents contiennent ce mot (terme), cela signifie que le mot (terme) est trop ordinaire et pas suffisant pour distinguer ces documents, donc moins il est important.
C'est aussi la technologie que les programmeurs apprennent. Pour les programmeurs eux-mêmes, plus ils maîtrisent cette technologie, mieux c'est (plus ils maîtrisent signifient que plus ils passent de temps, plus le TF est grand), et plus ils sont compétitifs lorsqu'ils recherchent un emploi. Cependant, pour tous les programmeurs, moins les personnes qui comprennent cette technologie, mieux c'est (moins il y a de personnes qui la comprennent), et plus ils sont compétitifs pour trouver un emploi. C'est la raison pour laquelle la valeur humaine réside dans l'irreplacabilité.
Une fois la vérité comprise, jetons un coup d'œil à la formule:
Il s'agit simplement d'une simple mise en œuvre typique de la formule de calcul du terme de poids. Les personnes qui mettent en œuvre le système de récupération de texte complet auront leur propre implémentation, et Lucene est légèrement différent de cela.
2. Le processus de jugement de la relation entre le terme et l'obtention de la corrélation du document, c'est-à-dire l'algorithme (VSM) du modèle d'espace vectoriel.
Nous considérons les documents comme une série de mots (terme), chaque mot (terme) a un poids (poids de terme) et différents mots (terme) affectent le calcul de notation de la pertinence du document en fonction de leur propre poids dans le document.
Nous considérons donc le poids du terme dans ce document comme un vecteur.
Document = {Term1, Term2,…, Term n}
Document Vector = {Weight1, Weight2, ..., poids n}
De même, nous considérons la déclaration de requête comme un document simple et l'exprimons également dans les vecteurs.
Query = {Term1, Terme 2,…, terme n}
Vector de requête = {poids1, poids2, ..., poids n}
Nous avons mis tous les vecteurs de documents recherchés et les vecteurs de requête dans un espace à n dimensions, et chaque mot (terme) est unidimensionnel.
Comme indiqué dans l'image:
Nous pensons que plus l'angle est petit entre deux vecteurs, plus la corrélation est grande.
Par conséquent, nous calculons la valeur cosinus de l'angle inclus comme score de corrélation. Plus l'angle est petit, plus la valeur du cosinus est grande, plus le score est élevé et plus la corrélation est élevée.
Certaines personnes peuvent demander que les déclarations de requête soient généralement très courtes et contiennent très peu de mots (terme), de sorte que les dimensions du vecteur de requête sont très petites, tandis que le document est très long, contient de nombreux mots (terme), et les dimensions du vecteur de document sont très grandes. Pourquoi les dimensions des deux dans votre graphique N?
Ici, comme vous voulez le mettre dans le même espace vectoriel, les dimensions naturelles sont les mêmes. Différent en même temps, prenez l'union des deux. S'il n'y a pas de mot (terme), le poids (poids du terme) est 0.
La formule de notation de corrélation est la suivante:
Par exemple, il y a 11 terme dans l'instruction de requête et trois documents sont recherchés. Les poids respectifs (poids à terme) sont les suivants.
T1 | T2 | T3 | T4 | t5 | t6 | T7 | t8 | t9 | t10 | T11 | |
D1 | 0 | 0 | .477 | 0 | .477 | .176 | 0 | 0 | 0 | .176 | 0 |
D2 | 0 | .176 | 0 | .477 | 0 | 0 | 0 | 0 | .954 | 0 | .176 |
D3 | 0 | .176 | 0 | 0 | 0 | .176 | 0 | 0 | 0 | .176 | .176 |
Q | 0 | 0 | 0 | 0 | 0 | .176 | 0 | 0 | .477 | 0 | .176 |
Par conséquent, les scores de corrélation entre les trois documents et l'énoncé de requête sont calculés comme suit:
Par conséquent, le document 2 a la corrélation la plus élevée, les premiers rendements, suivis du document 1, et enfin le document 3.
Jusqu'à présent, nous pouvons trouver la documentation que nous voulons le plus.
Cela dit, je ne suis pas encore entré à Lucene, mais ce n'est que la théorie de base de la récupération de l'information. Cependant, après avoir regardé Lucene, nous constatons que Lucene est une pratique de base de cette théorie de base. Par conséquent, dans les articles analysant Lucene, nous verrons souvent l'application de la théorie ci-dessus dans Lucene.
Avant d'entrer à Lucene, un résumé du processus de création et de recherche d'index ci-dessus est comme indiqué sur la figure:
Ce chiffre fait référence à l'article "Lucene, le moteur de recherche de texte complet du code open source" dans http://www.lucene.com.cn/about.htm
1. Processus d'indexation:
1) Il existe une série de fichiers indexés
2) Le fichier indexé est analysé syntaxe et le traitement du langage pour former une série de mots (terme).
3) Créez un dictionnaire et un tableau d'index inversé par indexation.
4) Écrivez l'index sur le disque dur via le stockage d'index.
2. Processus de recherche:
a) Instruction de requête d'entrée utilisateur.
b) Une série de mots (terme) est obtenue par analyse grammaticale et analyse linguistique de l'énoncé de requête.
c) Obtenez un arbre de requête par analyse de syntaxe.
d) Lisez l'index dans la mémoire via le stockage d'index.
E) Utilisez l'arborescence de requête pour rechercher l'index afin d'obtenir la liste des liens de document pour chaque mot (terme), soumettez la liste des liens de document et obtenez le document de résultat.
f) Trier le document de résultat recherché à la pertinence de la requête.
g) Renvoyez le résultat de la requête à l'utilisateur.
2. Triez le dictionnaire par ordre alphabétique.
Terme | ID de document |
permettre | 1 |
permettre | 1 |
permettre | 2 |
bière | 1 |
Boire | 1 |
Boire | 2 |
Trouver | 2 |
ami | 1 |
ami | 2 |
aller | 1 |
aller | 2 |
son | 2 |
jerry | 2 |
Mon | 2 |
école | 2 |
voir | 2 |
Étudiant | 1 |
Étudiant | 2 |
Leur | 1 |
Ils | 2 |
3. Fusez les mêmes mots (terme) dans la liste des liens inverse du document (liste de publication).
Dans ce tableau, il y a plusieurs définitions: