0 Introduction
Avec le développement du World Wide Web et l'avènement de l'ère du Big Data, une grande quantité d'informations numériques est produite, stockée, transmise et convertie chaque jour. Comment trouver des informations qui répondent à vos besoins d'une certaine manière à partir d'une grande quantité d'informations, afin qu'elle puisse être commandée et utilisée est devenue un problème majeur. La technologie de recherche en texte intégral est l'application de requête d'information la plus courante aujourd'hui. Dans la vie, les moteurs de recherche sont utilisés pour rechercher des informations dans les forums de blog. Le principe de base de ces recherches est la technologie de recherche en texte intégral à implémenter dans cet article. Avec la réalisation de la numérisation des informations sur les documents, le stockage efficace et en temps opportun et l'extraction avec précision des informations est la base de chaque entreprise, entreprise et unité pour poser une bonne base. Il existe déjà de nombreuses théories et méthodes matures pour la recherche en texte intégral en anglais. Le moteur de recherche en texte complet open source Lucene est un sous-projet de l'équipe de projet Jakarta de la Fondation du logiciel Apache. Son objectif est de fournir aux développeurs de logiciels une boîte à outils simple et facile à utiliser pour faciliter la mise en œuvre des fonctions de recherche en texte complet dans le système cible. Lucene ne prend pas en charge le chinois, mais il existe actuellement de nombreux segments de mots chinois open source qui peuvent indexer le contenu chinois. Sur la base de l'étude des principes de base de Lucene, cet article réalise respectivement ramper et la récupération des pages Web chinois et anglaises.
1 Introduction à Lucene
1.1 Introduction à Lucene
Lucene est une boîte à outils de moteur de recherche en texte complet écrit en Java, qui implémente deux fonctions principales: l'indexation et la recherche, et les deux sont indépendantes les unes des autres, ce qui permet aux développeurs de se développer facilement. Lucene fournit des API riches qui peuvent facilement interagir avec les informations stockées dans l'index. Il convient de noter qu'il ne s'agit pas d'une application complète de recherche de texte complet, mais fournit des fonctions d'indexation et de recherche pour l'application. Autrement dit, si Lucene veut vraiment fonctionner, il est nécessaire de faire un développement secondaire nécessaire en fonction de celle-ci.
La conception structurelle de Lucene est similaire à celle de la base de données, mais l'index de Lucene est très différent de celui de la base de données. Les bases de données et l'indexation de Lucene sont toutes pour la commodité de la recherche, mais la base de données n'est établie que pour certains champs, et les données doivent être converties en informations formatées et enregistrées. La recherche en texte intégral consiste à indexer toutes les informations d'une certaine manière. Les différences et les similitudes des deux recherches sont présentées dans le tableau 1-1.
Tableau 1-1: Comparaison de la recherche de bases de données et de la recherche de lunene
Comparaison | Recherche lucene | Récupération de la base de données |
Récupération des données | Découvrez à partir du fichier d'index de Lucene | Récupérer les enregistrements de l'index de la base de données |
Structure d'index | Document | Enregistrer |
Résultats de la requête | Hit: document la composition qui satisfait les relations | Ensemble de résultats de requête: enregistrements contenant des mots clés |
Recherche en texte intégral | soutien | Non pris en charge |
Requête floue | soutien | Non pris en charge |
Tri des résultats | Régler des poids et des corrélation de tri | Ne peut pas être trié |
1.2 Lucene Structure globale
Le formulaire de version du progiciel Lucene est un fichier JAR, avec des mises à jour de version rapide et de grandes lacunes de version. Cet article utilise la version 5.3.1 et les principaux sous-packages utilisés sont présentés dans le tableau 1-2.
Tableau 1-2: sous-packages et fonctions
Nom de package | Fonction |
Org.apache.lucene.analysis | Participe |
Org .apache.lucene .Document | Documentation pour la gestion de l'index |
Org .apache.lucene .index | Indexation des opérations, y compris l'addition, la suppression, etc. |
Org.apache.lucene.queryparser | Requête, construire des expressions de recherche |
Org .apache.lucene .search | Gestion de la recherche |
Org .apache.lucene .store | Gestion du stockage des données |
Org .apache.lucene .util | Catégorie publique |
1.3 Conception d'architecture lucene
Lucene a des fonctions très puissantes, mais fondamentalement, il comprend principalement deux parties: l'une consiste à indexer l'index dans la bibliothèque après la segmentation du contenu texte; L'autre consiste à renvoyer les résultats en fonction des conditions de requête, c'est-à-dire pour établir un index et une requête.
Comme le montre la figure 1-1, cet article propose des interfaces externes et des sources d'informations, en se concentrant sur l'indexation et l'interrogation du contenu texte rampé par les pages Web.
Figure 1-1: Conception d'architecture de Lucene
2 Configuration de la variable d'installation et d'environnement JDK
1.JDK Téléchargement:
Téléchargez le package compressé qui correspond à la version système sur le site officiel d'Oracle, et l'URL est la suivante. Cliquez sur Installer et installer en fonction des invites. Pendant le processus d'installation, vous inviterez à installer JRE, cliquez sur oui.
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Définir les variables d'environnement:
(1) ordinateur de clic droit =》 Propriétés =》 Paramètres système avancés =》 Variable d'environnement =》 Variable système =》 Nouveau =》 Java_Home: Chemin d'installation
(2) nouvellement ajouté à Path =》% java_home% / bin
3. Si le test est réussi:
Start =》 run =》 cmd Entrez dans la fenêtre DOS pop-up
Entrez: Java -Version affichera les informations de version.
Entrez: les informations d'utilisation de Javac apparaissent dans Javac
L'apparence est comme le montre la figure 2-1 comme succès.
Figure 2-1: Configuration de la boîte de commande CMD Test Java
3. Écrivez du code Java pour obtenir du contenu Web
Parce que Lucene doit utiliser différents segments de mots pour différentes langues, les segments de mots standard sont utilisés en anglais et les segments de mots smartCN sont utilisés en chinois. Lors de l'obtention d'une page Web, obtenez d'abord la page Web en tant que fichier HTML. Dans le HTML, l'interférence de TAG affectera l'effet de récupération. Par conséquent, la balise HTML doit être éliminée et le contenu texte est converti en un fichier TXT pour enregistrer. À l'exception des participants aux mots, les autres en chinois et en anglais sont fondamentalement les mêmes, donc tout code ultérieur et démonstration des résultats expérimentaux seront sélectionnés. Cet article sélectionne cinquante pages Web d'histoires chinoises et anglaises comme exemples.
La conception de code spécifique est la suivante: URL2html.java convertit l'URL d'entrée de la page Web en un fichier html, et le fichier html2txt.java réalise la suppression de la balise de document HTML et la convertit en document TXT. Les codes spécifiques sont représentés sur les figures 3-1 et 3-2.
public void way (string filepath, string url) lève une exception {file dest = new File (filepath); // create File inputStream est; // reçoivent du flux de l'octcie FileOutputStream fos = new fileoutputStream (dest); // byte stream url wangzhi = new URL (url); // set url is = wangzhi.opensstream (); BufferedInputStream bis = new BufferedInputStream (IS); // Buffered BufferedOutputStream pour le flux d'entrée d'octet Bos = new BufferedOutputStream (FOS); // tampon le flux de sortie d'octet / * * Lire l'octet * / int longueur; octet [] octets = nouveau octet [1024 * 20]; while ((longueur = bis.read (octets, 0, bytes.length))! = -1) {fos.write (octets, 0, longueur); } / * * Fermer le flux tamponné et le flux d'entrée et de sortie * / bos.close (); fos.close (); bis.close (); is.close (); } public String getBody (String val) {String zyf = val.replaceAll ("</? [^>] +>", ""); // Consultez la balise <html> return zyf;} public void writeTxt (String str, string writePath) {file writeName = new File (writePath); essayez {writeName.CreateEwFile (); BufferedWriter out = new BufferedWriter (nouveau FileWriter (WriteName)); out.write (str); out.flush (); out.close (); } catch (ioException e) {e.printStackTrace (); }}Prenant la page Web du conte de fées "Le stupide loup va à l'école" à titre d'exemple, le chemin du document est défini sur "e: / work / lunene / test / data / html" et "e: / work / lunene / test / data / txt". Les deux paramètres qui doivent être définis lors de la lecture de la page Web sont nommés nom de fichier et obtiennent l'URL de destination. Créez une nouvelle fonction principale pour implémenter les appels vers deux méthodes. L'implémentation spécifique est illustrée à la figure 3-3:
public static void main (string [] args) {String filename = "jingdizhi"; // nom de fichier chaîne url = "http://www.51test.net/show/8072125.html" ;//web page qui doit être une chaîne raressée filepath = "E: // work // lunene // test // data // html //" + nom de fichier + ".html"; // Écrivez le chemin du fichier de html + nom de fichier string writePath = "e: // work // lunene // test // data // txt //" + nom de fichier + ".txt"; // écrire le chemin du fichier de txt + nom de fichier url2html "; // = nouveau url2html (); essayez {url2html.way (filepath, url); } catch (exception e) {e.printStackTrace (); } Html2txt html2txt = nouveau html2txt (); String read = html2txt.readfile (filePath); // Lire le fichier html String txt = html2txt.getbody (read); // supprimer le tag html System.out.println (txt); essayez {html2txt.writeTxt (txt, writePath); } catch (exception e) {e.printStackTrace (); }}Après avoir exécuté le programme, créez respectivement "Silly Wolf School.html" et "Silly Wolf School.txt" dans deux dossiers.
4. Créer un index
Les principes de base de l'indexation et de la requête sont les suivants:
Indexation: l'indexation des moteurs de recherche consiste à implémenter la structure de données spécifique de la "matrice de document de mots". Il s'agit également de la première étape de la récupération en texte intégral. Lucene fournit une classe IndexWriter pour la gestion de l'index, y compris principalement Add (), Delete () et Update (). Il y a aussi le réglage des poids. Grâce au réglage de différents poids d'index, vous pouvez revenir en fonction de la taille de corrélation pendant la recherche.
Recherche: La recherche directe originale consistait à rechercher des documents en séquence. Après avoir établi un index, vous pouvez trouver l'emplacement où le mot d'index apparaît dans le document en recherchant l'index, puis renvoyer la position et le mot dans le document auquel l'élément d'index est correct. Lucene fournit la classe IndexSearcher pour rechercher des documents. Les formulaires de recherche sont principalement divisés en deux catégories. La première catégorie est un terme, qui recherche des éléments à terme; La deuxième catégorie est l'analyseur, qui peut personnaliser les expressions de recherche et a plus de formulaires de recherche. Les méthodes spécifiques seront démontrées plus tard.
4.1 Environnement expérimental
Ce PC utilise le système Windows 10x64, la mémoire 8G et le SSD 256G. L'environnement de développement est MyEclipse 10 et la version JDK est 1.8. Au cours de l'expérience, en raison de certains changements de syntaxe, plusieurs classes ont été implémentées à l'aide de la version 1.6.
4.2 Création d'un index
La création d'une bibliothèque d'index consiste à ajouter des enregistrements d'index à la bibliothèque d'index. Lucene fournit une interface pour ajouter des enregistrements d'index et ajouter des index.
Il utilise principalement trois catégories: "Écrire l'indexer", "document" et "domaine". Pour créer un index, vous devez d'abord construire un objet de document de document et déterminer les différents champs du document. Ceci est similaire à l'établissement d'une structure de table dans une base de données relationnelle. Le document équivaut à une ligne d'enregistrement dans une table, et le champ équivaut à une colonne d'affilée. Dans Lucene, pour les propriétés et les exigences de sortie de données de différents domaines, différentes règles de champ d'index / magasin peuvent être sélectionnées pour le domaine. Dans cette expérience, le nom de fichier de fichier, le nom de fichier FullPath et le contenu texte sont utilisés comme champs du document.
IndexWriter est chargé de recevoir des documents nouvellement ajoutés et de les écrire à la bibliothèque d'index. Lors de la création de l'index indexwriter indexwriter, vous devez spécifier l'analyseur de langage que vous utilisez. La création d'index est divisée en deux catégories: la première: indice non pondéré; Le second: indice pondéré.
public indexer (String indexDir) lève l'exception {répertoire dir = fsDirectory.open (paths.get (indexdir)); Analyseur analyseur = nouveau standardAnalyzer (); // Divider de mot standard // SmartCheneSeanalyzer Analyzer = new SmartCheneSeAnalyzer (); INDEXWRITERCONFIG IWC = NOUVEAU INDEXWRIERCONFIG (Analyzer); écrivain = new IndexWriter (dir, iwc); }Définissez le champ d'index et le magasin indique si le contenu de l'index est stocké: le nom de fichier et FullPath prennent moins de mémoire et peuvent être stockés pour faciliter le retour de la requête.
Document privé getDocument (fichier f) lève une exception {document doc = nouveau document (); doc.add (new TextField ("Contenu", nouveau FileReader (F))); doc.add (new TextField ("FileName", f.getName (), store.oes)); doc.add (new TextField ("fullPath", f.getCanonicalPath (), store.yes)); // Path Index Retour Doc; }Le résultat après l'exécution du code principal est illustré à la figure: Lors de l'indexation d'un fichier, la conception renvoie le fichier "Fichier d'index: + chemin de fichier" et calcule le temps nécessaire pour sortir l'index de tous les fichiers.
4.3 Supprimer et modifier l'index
Généralement, les opérations sur les bases de données incluent Crud (ajouter, supprimer, modifier, requête). Ajouter des moyens de sélection et d'établissement d'éléments d'index. La requête, en tant que fonction plus centrale, sera discutée plus tard. Ici, nous enregistrons principalement les méthodes utilisées lors de la suppression et de la mise à jour des index.
La suppression est divisée en deux types, y compris la suppression ordinaire et la suppression complète, car la suppression de l'indice affecte la base de données entière. De plus, pour les grands systèmes, la suppression des indices signifie changer la couche sous-jacente du système, qui prend du temps et à forte intensité de main-d'œuvre et ne peut pas être retournée. Lorsque l'index a été indexé pour la première fois, plusieurs petits fichiers ont été générés après l'établissement de l'index. Lors de la recherche, chaque fichier sera fusionné puis recherché. La suppression ordinaire n'est qu'un simple marquage de l'indice précédemment établi, ce qui rend impossible la recherche et le retour. La suppression complète signifie détruire l'indice et ne peut pas être révoquée. Prenez l'exemple de supprimer un index avec l'élément d'index "id" de 1:
Suppression normale (supprimer avant de fusionner):
writer.deletedocuments (nouveau terme ("id", "1")); writer.commit ();Supprimer complètement (supprimer après la fusion):
writer.deletedocuments (nouveau terme ("id", "1")); writer.forcemergeletes (); // Force Delete Writer.Commit ();Le principe de modification de l'indice est relativement simple, qui est d'implémenter la couverture sur la base de l'index d'origine. Le code d'implémentation est le même que l'ajout de l'index dans le texte ci-dessus. Je ne l'expliquerai pas ici.
4.4 Pondération des indices
Lucene est trié par pertinence par défaut. Lucene fournit un champ avec un paramètre de stimulation qui peut être défini. Ce paramètre est utilisé pour indiquer l'importance des enregistrements. Lorsque les conditions de recherche sont remplies, les enregistrements avec une grande importance seront prioritaires et le résultat de retour sera dépassé. S'il y a de nombreux records, des enregistrements de faible poids seront classés derrière la page d'accueil. Par conséquent, l'opération de pondération sur l'indice est un facteur important affectant la satisfaction du résultat de retour. Lors de la conception réellement du système d'information, il devrait y avoir des formules de calcul de poids strictes pour faciliter le changement du poids du terrain et mieux répondre aux besoins des utilisateurs.
Par exemple, les moteurs de recherche auront un taux de clic élevé, et les pages Web liées et qui sont sorties seront classées première page à leur retour. Le code d'implémentation est illustré à la figure 4-1, et les paires de résultats pondérées en somme non pondérées sont illustrées à la figure 4-2.
TextField Field = new TextField ("FullPath", f.getCanonicalPath (), Store.Ouse); if ("A Great Grief.txt" .Equals (f.getName ())) {field.setBoost (2.0f); // Ponctionnait le chemin FullPath avec le nom de fichier Second Story.txt; } // Le poids par défaut est de 1,0 et passe à 1,2 pour augmenter le poids. doc.add (champ);Figure 4-1: pondération d'index
Figure 4-2: Avant la pondération
Figure 4-2: Après pondération
Comme on peut le voir dans les résultats de la figure 4-2, lorsqu'il est pondéré, il est retourné dans l'ordre du dictionnaire. Par conséquent, avant le second, le premier est pondéré et l'ordre du fichier nommé deuxième est modifié lorsque le retour est retourné, réalisant le test du poids.
5 effectuer une requête
L'interface de recherche de Lucene est principalement composée de trois classes: QueryParser, IndexSearcher et Hits. QueryParser est un analyseur de requête, responsable de l'analyse des mots clés de requête soumis par les utilisateurs. Lors de la création d'un nouvel analyseur, vous devez spécifier le domaine pour être analysé et quel analyseur de langue à utiliser. L'analyseur de langue utilisé ici doit être le même que l'analyseur utilisé lorsque la bibliothèque d'index est établie, sinon le résultat de la requête sera incorrect. IndexSearcher est un chercheur d'index. Lorsque vous instanciez IndexSearcher, vous devez spécifier le répertoire où se trouve la bibliothèque d'index. IndexSearcher a une méthode de recherche pour effectuer une recherche d'index. Cette méthode accepte la requête en tant que paramètre et renvoie des coups. HISTS est une collection d'une série de résultats de requête triés. L'élément de la collection est un document. Grâce à la méthode GET du document, vous pouvez obtenir des informations sur le fichier correspondant à ce document, telles que: nom de fichier, chemin de fichier, contenu de fichier, etc.
5.1 Requête de base
Comme le montre la figure, il existe deux façons principales de remettre en question, mais il est recommandé d'utiliser le premier type de construction de l'expression de QueryParser, qui peut avoir des combinaisons flexibles, y compris l'expression logique booléenne, l'appariement flou, etc., mais le deuxième type de terme ne peut être utilisé que pour la requête du vocabulaire.
1. Construisez le formulaire de requête QueryParser:
QueryParser Parser = new QueryParser ("FullPath", analyseur); Query Query = Parser.Parse (Q);2. Requête pour les articles spécifiques:
Term t = new Term ("FileName", Q); Query Query = new TermQuery (T);Le résultat de la requête est illustré à la figure 5-1: Prenez le nom de fichier de fichier de requête contenant "Big" comme exemple.
Figure 5-1: Résultats de la requête "gros"
5.2 Requête floue
Lors de la construction de QueryParser, une correspondance précise et une correspondance floue peuvent être obtenues en modifiant le terme q. La correspondance floue est modifiée en ajoutant "~" après "q". Comme le montre la figure 5-2:
Figure 5-2: correspondance floue
5.3 Requête de condition qualifiée
La requête logique booléenne et la requête floue doivent seulement modifier le mot de requête Q, tandis que la requête conditionnelle limitée doit définir l'expression de la requête, qui est principalement divisée dans les catégories suivantes:
Il s'agit d'une recherche de plage d'éléments spécifiée, d'une plage de nombres spécifiée, d'une chaîne spécifiée commençant et d'une requête multi-conditions, qui répertorie respectivement les requêtes appliquées. Le véritable paramètre fait référence à la question de savoir si les limites supérieures et inférieures sont incluses.
Spécifiez la plage d'articles:
TermRangeQuery query = new TermRangeQuery ("desc", new bytesRef ("b" .getBytes ()), new bytesRef ("c" .getBytes ()), true, true);Spécifiez la plage de nombres:
NumericRangeQuery <Integer> Query = NumericRangeQuery.NewIntrange ("ID", 1, 2, true, true);Spécifiez le début de la chaîne:
PrefixQuery query = new PrefixQuery (nouveau terme ("ville", "a"));Requête multi-conditionnement:
NumericRangeQuery <Integer> Query1 = NumericRangeQuery.NewIntrange ("Id", 1, 2, True, True); PrefixQuery Query2 = New PrefixQuery (nouveau terme ("City", "A")); BooleanQuery.Bueder BooleanQuery = New BooleanQuery.Builder (); booleanQuery.add (Query1, booleandcause.occur.must); booleanQuery.add (query2, booleANClause.occur.must);5.4 Fixer la requête
Dans des moteurs de recherche tels que Baidu et Google, lors de l'interrogation, la page Web renvoyée sera affichée en rouge lorsqu'elle contient des mots clés de requête et sera affichée en résumé, c'est-à-dire que certains contenus contenant les mots clés sont interceptés et renvoyés. La requête en surbrillance consiste à réaliser que les changements de style des mots clés. Cette expérience est réalisée dans MyEclipse. Il n'y aura pas de modifications de style lors du retour du résultat. Il ajoutera uniquement des balises HTML aux mots clés qui renvoient le contenu. S'il est affiché sur la page Web, les modifications de style se produiront.
Le code de réglage en surbrillance est illustré à la figure 5-3, et les résultats sont présentés sur la figure 5-4. Les mots correspondants de Nanjing seront ajoutés et étiquetés, qui seront audacieux et rouges lorsqu'ils sont affichés sur la page Web.
QuerysCorerer SCOREURE = NOUVEAU QUERYSCORE (Query); fragmenteur fragmenteur = new SimppanFragmenter (buteur); SimpleHtmlFormatter SimpleHtmlFormatter = new SimpleHtmlFormatter ("<b> <Font Color = 'Red'>", "</font> </b>"); marqueur); Highlighter.SeTTextFragmenter (fragmenter);Figure 5-3: Paramètres en surbrillance
Figure 5-4: mettez en surbrillance les résultats
6 problèmes et lacunes rencontrées pendant l'expérience
La version Lucene est mise à jour rapidement, et une bonne connexion est nécessaire entre la version JDK, la version Eclipse et la version Lucene, sinon elle entraînera beaucoup d'incompatibilité. Il existe de nombreuses difficultés dans la version de débogage et la sélection de JDK1.6 et JDK1.8. Par exemple, la méthode annexe dans le flux Web a été supprimée dans la version 1.8 et ne peut pas être utilisée. Cependant, la lecture de la force du chemin du document fsDirectory.open () nécessite que JDK1.8 le soutienne.
Les lacunes de cette expérience se reflètent principalement dans:
Le code est moins flexible. Lorsque vous rampez des pages Web, cela doit être fait manuellement et cela doit être fait séparément en chinois et en anglais. Le code doit être amélioré afin qu'il y ait un jugement sur la langue de la page Web, puis il sélectionnera et exécutera automatiquement différents segments de mots.
Le code a une faible réutilisabilité et pas plus de classification et de construction de méthode plus raisonnables. Pour plus de simplicité, l'effet est essentiellement obtenu par annotation et marquer dans plusieurs codes de base, qui doivent être améliorés.
Le code est faible en portabilité, et le rampage des pages Web utilise la version JDK1.6, et l'implémentation de Lucene utilise la version JDK1.8. Lors de l'exportation vers d'autres machines, l'environnement doit être légèrement modifié et configuré, et le fonctionnement en un clic ne peut pas être réalisé.
7 Résumé
Sur la base des principes de Lucene, cet article comprend les idées et les méthodes de recherche en texte intégral, et mène des expériences et des tests sur des fonctions couramment utilisées. Au cours de l'expérience, j'ai appris les principes des moteurs de recherche et j'ai eu une meilleure expérience pratique basée sur le contenu du cours de récupération de l'information. Lucene est un excellent cadre de technologie de recherche de texte complet open source. Grâce à des recherches approfondies à ce sujet, nous connaissons davantage son mécanisme de mise en œuvre. Dans le processus d'étude, nous avons appris beaucoup de méthodes et d'idées de programmation orientées objet. Son bon cadre système et son évolutivité valent la peine d'être appris.