[英]How to implement Autocomplete Feature using Spring Rest MVC service
我的數據以用戶定義對象的形式在哈希集中(哈希包含文檔對象,並且由名稱和id組成兩個屬性)
當用戶輸入三個字符時,我必須開發一個Rest Service。
該服務將被觸發,並且該服務將針對HashSet Document對象的name屬性進行搜索並發送結果。
請給我建議一些方法
稍后會擔心自動完成功能-您需要先編寫過濾器部分。
選項包括:
為什么要使用哈希集? 使用數據庫(也許是Sqlite)。 對輸入的數據子字符串執行WHERE查詢。
循環整個集合,並將部分匹配項添加到可以返回的集合中。
無論哪種方式,REST服務似乎都不是您的問題-而是如何以一種明智/快速的方式將結果返回給客戶端。 在這種情況下,絕對建議使用數據庫
我在這里感覺到兩個問題:
第一個是如何在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*/
}
}
請注意,在將List<Item>
轉換為json(或另一種形式)的路徑上,您將需要一個序列化程序,例如Jackson
。 上面的代碼將解析對path/to/domain?search=foo
請求。
謝謝大家提供寶貴的意見
我找到了其他方法。 使用apache solr我們可以實現自動完成功能。 我的設計有很小的變化(尚未實現),我將使用solr服務器檢索我的所有數據並為其編制索引。
使用Rest API,我將通過傳遞搜索字符串來調用solr服務器。 在solr中,服務器數據已被索引,因此我將獲得快速搜索結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.