簡體   English   中英

如何使用Spring Rest MVC服務實現自動完成功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM