2016-08-18 3 views
0

Моих данных в HashSet в виде User Defined объекта (HashSet содержит объект Document, и она состоит из имени и идентификатора в виде двух свойств)Как реализовать функции автозаполнения с помощью сервиса Spring Rest MVC

У меня есть для разработки службы отдыха, когда пользователь вводит три символа.
Служба будет запущена и эта служба будет выполнять поиск по имени имени объекта объекта HashSet Document и отправляет результат.

Пожалуйста, предложить мне подход

+1

Испытание и ошибка - отличный подход. что ты уже испробовал? –

+0

Я не понимаю, как итерации каждого объекта и поиска? Мой объект Hashset содержит около 8000 объектов. Ищем лучший подход – Maddy

+0

Каков ваш подход? у вас есть образец кода даже * прототип *? – emotionlessbananas

ответ

2

Беспокойство о автозаполнения позже - вам нужно написать фильтрующую часть первой.

Возможные варианты:

Почему хэш? Используйте базу данных (возможно, Sqlite). Выполните запрос WHERE в подстроке вводимых данных.

Прокрутите весь набор и добавьте частичные совпадения в коллекцию, которую вы можете вернуть.

В любом случае, служба REST не кажется вашим вопросом - это то, как вернуть результаты разумным/быстрым способом обратно к клиенту. В этом случае база данных, безусловно, рекомендуются

1

чуя два вопроса:

Первым, как выполнить поиск по HashSet. В то время как 8000 предметов немного, вы можете немного оптимизировать. Начнем с:

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

Это будет проходить через весь комплект, но на несколько потоков. Если ваше поле автозаполнения, однако, хочет только производить элементы , начиная с с заданной строкой, вы можете улучшить производительность еще больше. Сначала соберите поле Set по названию. Вы можете сделать это, сделав свой Item инструмент Comparable.

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

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

В идеале использовать TreeSet вместо HashSet, чтобы получить детали всегда отсортирован.

Затем при поиске, вы можете что-то вроде этого цикла:

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; 
} 

Вторая часть вопроса связана с REST. В Spring MVC, вы можете реализовать что-то вроде этого:

@RestController 
public class SearchClass{ 

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

Заметьте, что вы будете нуждаться в сериалайзер, такие как Jackson на вашем пути, чтобы превратить List<Item> в JSON (или другой формы). Вышеупомянутый код разрешит запросы к path/to/domain?search=foo.

0

Спасибо всем предоставляя ценные комментарии

я нашел другой способ. Используя apache solr, мы можем реализовать функцию автозаполнения. В моем дизайне небольшие изменения (но для реализации) я буду использовать solr sever , чтобы получить все мои данные и проиндексировать его.

Использование Rest API Я буду вызывать сервер solr, передав строку поиска. в данных solr sever уже проиндексированы, поэтому я получаю быстрый результат поиска.

+0

Elasticsearch - еще один вариант –

+0

Спасибо 007 :-) – Maddy

Смежные вопросы