2016-08-18 5 views
0

Meine Daten sind in Hashset in Form von User Defined Object (die Hashset enthält das Dokument-Objekt, und es besteht aus Namen und ID als zwei Objekte)Wie Funktion zur automatischen Vervollständigung mit Spring Erholung MVC Service

Ich habe implementieren um einen Ruhezustand zu entwickeln, wenn der Benutzer drei Zeichen eingibt.
Der Dienst wird ausgelöst und dieser Dienst sucht nach der Eigenschaft name des HashSet-Dokumentobjekts und sendet das Ergebnis.

Bitte schlagen Sie mir einige Ansatz

+1

Versuch und Irrtum ist ein guter Ansatz. Was hast du bisher versucht? –

+0

Ich habe keine Gedanken, wie jedes Objekt zu iterieren und zu suchen? Mein Hashset-Objekt enthält die rund 8000 Objekte. Also auf der Suche nach dem besten Ansatz – Maddy

+0

Was ist Ihr Ansatz? hast du irgendein code probe sogar * prototyp *? – emotionlessbananas

Antwort

2

Worry über die zur automatischen Vervollständigung später - Sie müssen zuerst den Filterteil schreiben.

Optionen umfassen:

Warum ein hashset? Verwende eine Datenbank (vielleicht Sqlite). Führen Sie eine WHERE-Abfrage für den Teilstring der Daten aus, die Sie eingeben.

Wiederholen Sie den gesamten Satz und fügen Sie die Teilübereinstimmungen zu einer Sammlung hinzu, die Sie zurückgeben können.

In beiden Fällen scheint der REST-Dienst nicht Ihre Frage zu sein - es geht darum, die Ergebnisse auf eine vernünftige/schnelle Weise an den Client zurückzugeben. In diesem Fall wird die Datenbank auf jeden Fall

empfohlen
1

Ich spüre zwei Fragen hier:

Die erste ist, wie die Suche auf dem HashSet auszuführen. Während 8000 Artikel nicht viel sind, könntest du etwas optimieren. Beginnen wir mit:

List<Item> getItemsMatchingSearch(final String searchString){ 
    return mySet.parallelStream().filter((Item i)->i.getName().toLowerCase().contains(searchString.toLowerCase())).collect(Collectors.toList()); 
} 

Dies wird durch den gesamten Satz gehen, aber auf mehreren Threads. Wenn Ihr Autocomplete-Feld jedoch nur mit einer gegebenen Zeichenfolge produzieren möchte, können Sie die Leistung noch weiter verbessern. Sortiere zuerst deinen Set über das Namensfeld. Sie können dies tun, indem Sie Ihre Item implementieren Comparable.

class Item implements Comparable<Item>{ 
    /*...*/ 

    public int compareTo(Item other){ 
     return this.name.compareToIgnoreCase(other.name); 
    } 
} 

Idealerweise verwenden Sie einen TreeSet anstelle eines HashSet die Elemente sortiert immer zu bekommen.

dann bei der Suche können Sie Schleife etwas wie folgt aus:

List<Item> getItemsMatchingSearch(final String searchString){ 
    List<Item> result = new LinkedList<>(); 
    for(Item i:items){ 
     if(i.getName().compareToIgnoreCase(searchString)>0){ 
      break; 
     } 
     if(i.getName().toLowerCase().startsWith(searchString.toLowerCase()){ 
      result.add(i); 
     } 
    } 
    return result; 
} 

Der zweite Teil der Frage ist REST verwandt. In Spring MVC, können Sie so etwas wie dies umzusetzen:

@RestController 
public class SearchClass{ 

    @RequestMapping("/path/to/domain") 
    public @ResponseBody List<Item> getAutocompleteResult(@RequestParam("search") String searchTerm){ 
     /*... and here choose your favorite implementation*/ 
    } 
} 

Beachten Sie, dass Sie einen Serializer benötigen, wie Jackson auf Ihrem Weg List<Item> in json (oder eine andere Form) zu transformieren. Der obige Code löst Anfragen an path/to/domain?search=foo.

0

Vielen Dank an alle die wertvollen Kommentare Bereitstellung

i einen anderen Weg gefunden zu haben. Mit Apache Solr können wir Autocomplete-Funktion implementieren. Es gibt kleine Änderungen in meinem Design (Noch zu implementieren) Ich werde den solr Server verwenden, um alle meine Daten abzurufen und indizieren.

Mit der Rest-API werde ich den solr-Server aufrufen, indem ich die Suchzeichenfolge übergebe. in solr sever Daten sind bereits indiziert, so dass ich das schnelle Suchergebnis bekommen werde.

+0

Elasticsearch ist eine weitere Option –

+0

Danke 007 :-) – Maddy

Verwandte Themen