我的数据以用户定义对象的形式出现在Hashset中(Hashset包含Document对象,它由name和id组成两个属性)
当用户输入三个字符时,我必须开发Rest Service 该服务将被触发,该服务将搜索HashSet Document对象的name属性并发送结果。
请给我一些方法
答案 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服务器数据中已经编入索引,因此我将获得快速搜索结果。