如何使用Spring Rest MVC服务实现自动完成功能

时间:2016-08-18 00:06:08

标签: java rest spring-mvc

我的数据以用户定义对象的形式出现在Hashset中(Hashset包含Document对象,它由name和id组成两个属性)

当用户输入三个字符时,我必须开发Rest Service 该服务将被触发,该服务将搜索HashSet Document对象的name属性并发送结果。

请给我一些方法

3 个答案:

答案 0 :(得分:2)

担心以后自动完成 - 您需要先编写过滤器部分。

选项包括:

为什么要使用hashset?使用数据库(也许是Sqlite)。对您输入的数据的子字符串执行WHERE查询。

遍历整个集合并将部分匹配添加到您可以返回的集合中。

无论哪种方式,REST服务似乎都不是您的问题 - 它是如何以合理/快速的方式将结果返回给客户端。在这种情况下,绝对建议使用数据库

答案 1 :(得分: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的请求。

答案 2 :(得分:0)

谢谢大家提供的宝贵意见

我找到了其他一些方法。使用apache solr我们可以实现自动完成功能。 我的设计发生了很小的变化(但是要实现)我将使用solr服务器 检索我的所有数据并将其编入索引。

使用Rest API我将通过传递搜索字符串来调用solr服务器。 在solr服务器数据中已经编入索引,因此我将获得快速搜索结果。