Je me souviens que le professeur Java a dit une fois une question d'entrevue sur Baidu, ce qui signifie à peu près "il y a 10 000 dossiers désordonnés, comment trouver rapidement les dossiers que vous voulez". Cela équivaut à un simple moteur de recherche. Récemment, je l'ai déjà réalisé dans le travail que j'ai réglé cette année. Aujourd'hui, je partagerai avec vous davantage l'abstraire.
Écrivez d'abord le code d'implémentation spécifique et écrivez des idées d'implémentation spécifiques et une logique après le code.
Haricots utilisés pour le tri pendant la recherche
/ ** * @ Description: * / package cn.lulei.search.engine.model; classe publique SortBean {private String id; Temps d'intm privé; public String getID () {return id; } public void setid (String id) {this.id = id; } public int getTimes () {Temps de retour; } public void SetThimes (int times) {this.times = times; }} Structure de données de recherche construite et algorithme de recherche simple
/ ** * @ Description: * / package cn.lulei.search.Engine; import java.util.arraylist; Importer java.util.collections; Importer java.util.comparator; import java.util.hashmap; import java.util.hashset; Importer java.util.list; import Cn.lulei.search.engine.model.sortbean; classe publique Serachbase {// Détails Store Informations détaillées des objets de recherche, où la clé est l'identifiant unique pour distinguer l'objet HashMap privé <chaîne, objet> de détails = new HashMap <String, objet> (); // Pour les mots-clés participant à la recherche, le stockage de réseaux clairsemés utilisé ici peut également être stocké à l'aide de hashmap. Le format de définition est le suivant // STATIQUE STATIQUE PRIVATE <Integer, HashSet <string>> keySearch = new HashMap <Integer, HashSet <string >> (); // La valeur clé du support HashMap est équivalente à l'indice dans le tableau clairsemé, et la valeur est équivalente à la valeur du tableau clairsemé à cette position privée statique finale intatic maxLength = caractères.max_value; @SuppressWarnings ("Unchecked") HashSet privé <string> [] keySearch = new HashSet [maxLength]; / ** * @ Description: Implémentez le mode Singleton, en utilisant le support d'initialisation à la demande pour charger * @ version: 1.1.0 * / classe statique privée LazyLoadSerachBase {private static final Serachbase Serachbase = new SeachBase (); } / ** * Le mode singleton est défini sur la fonction privée ici * / private Serachbase () {} / ** * @return * @Description: Get Singleton * / public static Serachbase getSerachBase () {return LazyLoadSerachBase.serachBase; } / ** * @param id * @return * @description: Obtenez des détails basés sur ID * / objet public getObject (String id) {return Details.get (id); } / ** * @param ids * @return * @description: Obtenez des détails basés sur les ID, séparez les ID avec "," * / public List <objet> getObjects (String ids) {if (ids == null || ".equals (ids)) {return null; } List <Object> objs = new ArrayList <Bject> (); String [] idArray = ids.split (","); for (String id: idArray) {objs.add (getObject (id)); } return objs; } / ** * @param key * @return * @description: trouvez l'ID correspondant en fonction des termes de recherche, et utilisez "," pour diviser entre ids * / public String getIDS (string key) {if (key == null || "" .equals (key)) {return null; } // find // idTimes stocke si chaque caractère dans le terme de recherche apparaît dans l'ID dans l'ID. idTimes = new HashMap <String, Integer> idTimes = new HashMap <String, Integer> (); // IDS stocke l'ID des caractères dans le terme de recherche. HashSet <string> ids = new HashSet <string> (); // Finding for (int i = 0; i <key.length (); i ++) {int at = key.charat (i); // Il n'y a pas de caractère correspondant dans le terme de recherche. Puis correspondre au caractère suivant if (keySearch [at] == null) {continuant; } pour (objet obj: keySearch [at] .toArray ()) {String id = (String) obj; INT TIMES = 1; if (ids.Contains (id)) {Times + = idTimes.get (id); idTimes.put (id, fois); } else {ids.add (id); idTimes.put (id, fois); }}} // Trier avec la liste des tableaux <mestRean> sortBeans = new ArrayList <SortBean> (); for (String id: ids) {sortbean sortBean = new sortBean (); SortBeans.Add (SortBean); sortBean.setid (id); sortBean.setTimes (idTimes.get (id)); } Collection.Sort (SortBeans, New Comparator <SultBean> () {public int compare (SortBean O1, SORTBEAN O2) {return o2.getTimes () - o1.getTimes ();}}); // Construire String return stringBuffer sb = new StringBuffer (); for (sortbean sortbean: sortbeans) {sb.append (sortbean.getId ()); SB.APPEND (","); } // Libérez la ressource idTimes.Clear (); idTimes = null; ids.Clear (); ids = null; sortBeans.Clear (); sortbeans = null; // return return sb.toString (); } / ** * @param id * @param searchKey * @param obj * @description: ajouter l'historique de la recherche * / public void add (String id, string searchKey, objet obj) {// Les paramètres sont partiellement vides et ne chargent pas if (id == null || searchKey == null || obj == null) {return; } // Enregistrer les détails de l'objet.put (id, obj); // Enregistrer le terme de recherche AddSearchKey (id, searchKey); } / ** * @param id * @param searchKey * @Description: Ajoutez des termes de recherche au domaine de recherche * / private void addSearchKey (String id, string searchKey) {// Les paramètres séparés sont vides et non chargés // Il s'agit d'une méthode privée, et le jugement suivant peut être rendu, mais pour le service de conception; } // Ce qui suit est le participe du caractère. Ici, vous pouvez également utiliser d'autres participes de mots matures pour (int i = 0; i <searchKey.length (); i ++) {// La valeur d'AT est équivalente à l'indice du tableau, et le hashset composé d'ID est équivalent à la valeur du tableau int at = searchkey.Charat (i); if (keySearch [at] == null) {hashSet <string> value = new HashSet <string> (); keySearch [at] = valeur; } keySearch [at] .add (id); }}} Cas de test:
/ ** * @ Description: * / package cn.lulei.search.engine.test; Importer java.util.list; import Cn.lulei.search.Engine.serachBase; Classe publique Test {public static void main (String [] args) {// TODO Méthode générée automatique Stub Serachbase Serachbase = Serachbase.getSerachBase (); Serachbase.add ("1", "Bonjour!", "Bonjour!"); Serachbase.add ("2", "Bonjour! Je suis Zhang San.", "Bonjour! Je suis Zhang San."); Serachbase.add ("3", "Le temps est plutôt bon aujourd'hui."); Serachbase.add ("4", "Qui êtes-vous?", "Qui êtes-vous?"); Serachbase.add ("5", "Le sujet des mathématiques avancées est difficile", "Les mathématiques élevées sont en effet difficiles."); Serachbase.add ("6", "test", "Ce qui précède est juste un test"); String ids = Serachbase.getids ("Vos mathématiques élevées"); System.out.println (ids); List <object> objs = serachbase.getObjects (ids); if (objs! = null) {for (objet obj: objs) {System.out.println ((String) obj); }}}} Les résultats de sortie de test sont les suivants:
5, 3, 2, 1, 4, les nombres plus élevés sont en effet difficiles. Le temps aujourd'hui est plutôt bon. Bonjour! Je suis Zhang San. Bonjour! Qui es-tu?
Un moteur de recherche aussi simple est considéré comme terminé.
Question 1: Le mot participe ici utilise le participe du caractère, ce qui est assez bon pour gérer le chinois, mais il est très faible dans la manipulation de l'anglais.
Méthode d'amélioration: utilisez la méthode de segmentation des mots mature actuelle, telle que Ikanalyzer, StandardAnalyzer, etc. De cette manière, la structure de données de KeySearch doit être modifiée, qui peut être modifiée à un hashmap privé <string, string> [] keysearch = new hashmap [maxLength]; où la clé stocke le mot élément de la pièce et que la valeur stocke l'ID d'identifiant unique.
Question 2: Le moteur de recherche implémenté dans cet article ne définit pas de poids pour les éléments de mots comme Lucene, mais détermine simplement si les éléments de mots apparaissent dans l'objet.
Méthode d'amélioration: aucun encore. L'ajout de traitement de poids rend la structure des données plus complexe, de sorte qu'elle n'a pas été traitée pour le moment, et le traitement du poids sera mis en œuvre dans les futurs articles.
Présentez brièvement les idées d'implémentation des moteurs de recherche .
Définissez les deux propriétés des détails et KeySearch dans la classe Serachbase. Les détails sont utilisés pour stocker les informations détaillées de l'objet, et KeySearch est utilisé pour indexer le domaine de recherche. Le format de données des détails est HashMAP, et le format de données de KeySearch est un tableau clairsemé (peut également être Hashmap, la valeur de clé moyenne HashMap est équivalente à l'indice dans le tableau clairsemé et la valeur est équivalente à la valeur du tableau épars à ce poste).
Je ne donnerai pas trop d'introduction aux détails.
La méthode de calcul des indices de tableau dans KeySearch (telles que HashMap est clé) est d'obtenir la première valeur intraticaire de l'élément de mots (car le mot participe de cet article utilise le participe de caractère, donc un caractère est un élément de mots). La valeur int est l'indice du tableau, et la valeur du tableau correspondant est l'identifiant unique de l'objet. De cette façon, la structure de données de KeySearch est la suivante
Par conséquent, lorsque vous souhaitez ajouter un nouvel enregistrement, il vous suffit d'appeler la méthode ADD.
La logique d'implémentation pour la recherche est similaire à la recherche KeySearch ci-dessus. Pour la recherche d'ID, utilisez simplement la méthode GET de HashMap. Pour une recherche de termes de recherche, le processus global utilise également la segmentation des mots d'abord, la requête en deuxième position et le dernier. Bien sûr, le mot participe ici doit être cohérent avec le mot participe utilisé pour créer (c'est-à-dire que le participe de caractère est utilisé lors de la création, et le participe du caractère est également utilisé lors de la recherche).
Dans la méthode getIDS, le hashmap <String, Integer> idTimes = new HashMap <String, Integer> (); la variable idTimes est utilisée pour stocker le nombre d'éléments de mots dans le terme de recherche apparaît dans KeySearch. La valeur clé est l'ID d'identifiant unique et la valeur est le nombre d'éléments de mot qui apparaissent. HashSet <string> ids = new HashSet <string> (); La variable IDS est utilisée pour stocker les ID de l'occurrence du mot. La complexité de la recherche de cette manière est le nombre d'éléments de mots n du terme de recherche. Obtenez les ID contenant des éléments de mot, construisez le tableau SortBean et triez-le. La règle de tri consiste à descendant l'ordre du nombre d'éléments de mots. Enfin, la chaîne IDS est renvoyée et chaque ID est divisé par ",". Si vous souhaitez obtenir des informations détaillées, utilisez la méthode GetObjects.
Ce qui précède est juste un simple moteur de recherche et n'a pas conçu trop de méthodes de calcul. J'espère que cela inspirera l'apprentissage de tout le monde.