Ich erinnere mich, dass der Java -Lehrer einmal eine Interviewfrage zu Baidu gesagt hat, was grob bedeutet: "Es gibt 10.000 ungeordnete Aufzeichnungen, wie Sie schnell die von ihnen gewünschten Aufzeichnungen finden." Dies entspricht einer einfachen Suchmaschine. Vor kurzem habe ich dies bereits in der Arbeit festgestellt, die ich in diesem Jahr geklärt habe. Heute werde ich Ihnen weiter mit Ihnen teilen.
Schreiben Sie zuerst einen spezifischen Implementierungscode und schreiben Sie nach dem Code bestimmte Implementierungsideen und Logik.
Bohnen zum Sortieren während der Suche
/ ** *@Beschreibung: */ Paket cn.lulei.search.engine.model; öffentliche Klasse Sortbean {private String -ID; private intzeiten; public String getid () {return id; } public void setID (String -ID) {this.id = id; } public int gettTimes () {Return Times; } public void setzzeit (int times) {this.times = Times; }} Konstruierte Suchdatenstruktur und einfacher Suchalgorithmus
/ ** *@Beschreibung: */ Paket cn.lulei.search.Engine; Import Java.util.ArrayList; Import Java.util.Collections; Java.util.comParator importieren; import Java.util.hashMap; import Java.util.hashset; importieren java.util.list; importieren cn.lulei.search.engine.model.sortbean; öffentliche Klasse Serachbase {// Details speichern detaillierte Informationen von Suchobjekten, wobei der Schlüssel die eindeutige Kennung für das Objekt privates Hashmap <String, Objekt> Details = New HashMap <String, Object> () ist; // Für Keywords, die an der Suche teilnehmen, kann der hier verwendete spärliche Arrayspeicher auch mit HashMap gespeichert werden. Das Definitionsformat lautet wie folgt // private statische HashMap <Integer, Hashset <string >> keysearch = new HashMap <Integer, Hashset <string >> (); // Der Schlüsselwert des Hashmap -Mediums entspricht dem Index im spärlichen Array, und der Wert entspricht dem Wert des spärlichen Arrays an dieser Position privates endgültiges statisches int maxLength = macchary.max_value; @SuppressWarnings ("Deaktiviert") private Hashset <String> [] keysearch = new Hashset [maxLength]; / ***@Beschreibung: Implementieren Sie den Singleton -Modus und verwenden Sie die Initialisierung auf Bedarf zum Laden*@Version: 1.1.0*/ private statische Klasse LazyloadSerachbase {private statische endgültige Serachbase Serachbase = New Serachbase (); } / *** Der Singleton -Modus wird hier auf private Funktion gesetzt* / private serachbase () {} / *** @return* @Description: Get Singleton* / public statische Serachbase getSerachbase () {return lazyloadserachbase.serachbase; } / ** * @param id * @return * @Description: Details basierend auf ID * / public Object getObject (String -ID) {retail details.get (id); } / ** * @param ids * @return * @Description: Get Details basierend auf IDs, trennen Sie die IDs mit "," * / publiclist <Object> getObjects (String ids) {if (ids == null || "" .Equals (ids)) {return null; } List <Object> objs = new ArrayList <Object> (); String [] idarray = ids.Split (","); für (String -ID: Idarray) {objs.add (getObject (id)); } return objs; } / ** * @param key * @return * @Description: Finden Sie die entsprechende ID gemäß den Suchbegriffen und verwenden Sie ", um" zwischen ids * / public String getIds (String -Taste) {if (key == null || "" .Equals (Schlüssel) {return null; } // Finden Sie // idtimes speichert, ob jedes Zeichen im Suchbegriff in der ID in der ID angezeigt wird. idtimes = new HashMap <String, Integer> idtimes = new HashMap <String, Integer> (); // IDS speichert die ID der Zeichen im Suchbegriff. HashSet <String> ids = new Hashset <string> (); // Finden für (int i = 0; i <key.length (); i ++) {int at = key.charat (i); // Es gibt kein entsprechendes Zeichen im Suchbegriff. Dann überein das nächste Zeichen if (keysearch [at] == null) {Fortsetzung; } für (Objekt obj: keysearch [at] .toArray ()) {String id = (String) obj; int Times = 1; if (ids.contains (id)) {Times += idtimes.get (id); idtimes.put (id, mal); } else {ids.add (id); idtimes.put (id, mal); }}} // Sortieren Sie mit Array -Liste <Sortbean> sortBeans = new ArrayList <Sortbean> (); für (String -ID: ids) {sortbean sortbean = new sortbean (); Sortbeans.add (Sortbean); sortbean.setid (id); sortbean.settimes (idtimes.get (id)); } Collectionss.sort (Sortbeans, neuer Komparator <Sortbean> () {public int compare (sortbean O1, Sortbean O2) {return o2.gettimes () - o1.gettimes ();}}); // Construct return String StringBuffer sb = new StringBuffer (); für (sortbean sortbean: sortbeans) {sb.append (sortbean.getId ()); sb.Append (","); } // die Ressourcen -IDTimes.Clear () freigeben; idtimes = null; ids.clear (); ids = null; sortbeans.clear (); Sortbeans = null; // return return sb.tostring (); } /** * @param id * @param SearchKey * @param obj * @Description: Suchhistorie hinzufügen * /public void add (String -ID, String -Searchkey, Object OBJ) {// Die Parameter sind teilweise leer und laden Sie nicht, wenn (id == null || } // Objektdetails speichern (id, obj); // Suchbegriff addSearchKey (ID, SearchKey) speichern; }/** * @param id * @param SearchKey * @Description: Hinzufügen von Suchbegriffen zur Suchdomäne */private void addSearchKey (String -ID, String -Searchkey) {// separate Parameter sind leer und nicht geladen // Dies ist eine private Methode, und das folgende Urteil kann gemacht werden, aber für die Entwurfspezifikationen, wenn (id == null || || || || } // Folgendes ist Zeichen Partizip. Hier können Sie auch andere reife Wortpartizipien für (int i = 0; i <searchkey.length (); i ++) {// Der Wert von AT entspricht dem Index des Arrays und dem aus ID zusammengestellten Hashset entspricht dem Wert des Array int = SearchKey.charat (i). if (keysearch [at] == null) {Hashset <string> value = new Hashset <string> (); keysearch [at] = Wert; } keysearch [at] .add (id); }}} Testfälle:
/ ** *@Beschreibung: */ Paket cn.lulei.search.engine.test; importieren java.util.list; importieren cn.lulei.search.engine.serachbase; public class test {public static void main (String [] args) {// Todo automatisch generierte Methode Stub Serachbase Serachbase = Serachbase.getSerachbase (); Serachbase.add ("1", "Hallo!", "Hallo!"); Serachbase.add ("2", "Hallo! Ich bin Zhang San.", "Hallo! Ich bin Zhang San."); Serachbase.add ("3", "Das Wetter ist heute ziemlich gut."); Serachbase.add ("4", "Wer bist du?", "Wer bist du?"); Serachbase.add ("5", "Gegenstand der fortgeschrittenen Mathematik ist schwierig", "hohe Mathematik ist in der Tat schwierig."); Serachbase.add ("6", "Test", "Das obige ist nur Test"); String ids = Serachbase.getIds ("Ihre hohe Mathematik"); System.out.println (IDS); List <Object> objs = Serachbase.getObjects (IDS); if (objs! }}}} Die Ergebnisse der Testausgabe lauten wie folgt:
5, 3, 2, 1, 4, höhere Zahlen sind in der Tat schwierig. Das Wetter heute ist ziemlich gut. Hallo! Ich bin Zhang San. Hallo! Wer bist du?
Eine so einfache Suchmaschine wird als abgeschlossen angesehen.
FRAGE 1: Das Wort Partizip hier verwendet Charakterpartizip, was bei der Behandlung von Chinesen ziemlich gut ist, aber es ist sehr schwach im Umgang mit Englisch.
Verbesserungsmethode: Verwenden Sie die aktuelle Methode zur Segmentierung des reifen Wortes, wie z. Wo der Schlüssel das Wort Element des Teils speichert und der Wert die eindeutige ID -ID speichert.
Frage 2: Die in diesem Artikel implementierte Suchmaschine setzt keine Gewichte für Wortelemente wie Lucene, sondern bestimmt einfach, ob im Objekt Wortelemente angezeigt werden.
Verbesserungsmethode: Noch keine. Durch das Hinzufügen der Gewichtsverarbeitung wird die Datenstruktur komplexer, sodass sie vorerst nicht verarbeitet wurde und die Gewichtsverarbeitung in zukünftigen Artikeln implementiert wird.
Lassen Sie uns kurz die Implementierungsideen von Suchmaschinen vorstellen.
Legen Sie die beiden Eigenschaften von Details und Keysearch in der Serachbase -Klasse ein. Details werden verwendet, um die detaillierten Informationen des Objekts zu speichern, und Keysearch wird verwendet, um die Suchdomäne zu indizieren. Das Detail -Datenformat ist HashMap, und das Datenformat der Keysarch ist ein spärliches Array (kann auch HashMap sein, der HashMap -Medium -Schlüsselwert entspricht dem Einweis im Spartarray, und der Wert entspricht dem Wert des Spart -Arrays an dieser Position).
Ich werde nicht zu viel Einführung in Details geben.
Die Berechnungsmethode von Array -Indexs in Keysearch (wie HashMap ist der Schlüssel), besteht darin, den ersten Charakter -Int -Wert des Worteselements zu erhalten (weil das Wort Partizip in diesem Artikel das Charakterpartizip verwendet, also ist ein Zeichen ein Wortelement). Der int -Wert ist der Index des Arrays, und der entsprechende Array -Wert ist die eindeutige Kennung des Objekts. Auf diese Weise lautet die Datenstruktur der Keysearch wie folgt
Wenn Sie also einen neuen Datensatz hinzufügen möchten, müssen Sie nur die Methode hinzufügen.
Die Implementierungslogik für die Suche ähnelt der obigen Keysearch. Für die ID -Suche verwenden Sie einfach die GET -Methode von HashMap. Für eine Suche nach Suchbegriffen verwendet der Gesamtprozess auch zuerst Word -Segmentierung, zweitens und sortiert zuletzt. Natürlich sollte das Wort Partizip hier mit dem zum Erstellen verwendeten Wort Partizip übereinstimmen (dh bei der Erstellung von Charakteren und beim Suchen wird auch das Charakterpartizip verwendet).
In der GetIDS -Methode, der HashMap <String, Integer> idtimes = new HashMap <String, Integer> (); IDTimes Variable wird verwendet, um zu speichern, wie viele Wortelemente im Suchbegriff in Keysarch angezeigt werden. Der Schlüsselwert ist die eindeutige ID für die Kennung und der Wert ist die Anzahl der angezeigten Wortelemente. HashSet <String> ids = new Hashset <string> (); Die IDS -Variable wird verwendet, um die IDs des Auftretens des Wortes zu speichern. Die Komplexität der Suche auf diese Weise ist die Anzahl der Wortelemente n des Suchbegriffs. Erhalten Sie die IDs, die Wortelemente enthalten, konstruieren Sie das Sortbean -Array und sortieren Sie es. Die Sortierregel ist die absteigende Reihenfolge der Anzahl der Wortelemente. Schließlich wird die IDS -Zeichenfolge zurückgegeben und jede ID wird durch "," geteilt. Wenn Sie detaillierte Informationen erhalten möchten, verwenden Sie die GetObjects -Methode.
Das obige ist nur eine einfache Suchmaschine und hat nicht zu viele Berechnungsmethoden entworfen. Ich hoffe, es wird das Lernen aller inspirieren.