2014-03-31 56 views
3

我正在使用Grails 2.3.7。我通過騎乘restfull控制器界面將我的控制器暴露爲REST控制器。我的客戶是AngularJS。我的CRUD操作正常。我現在需要在各種對象上編寫搜索API,例如搜索帳戶名稱和編號,或者在客戶電子郵件上搜索客戶對象。Grails 2.3.7 Rest API - 搜索/查詢

什麼應該是寫這種搜索API的有效和最好的方式?我可以爲每個搜索條件編寫一個API,但是在搜索條件可以作爲JSON發佈並應用於相應的資源對象時尋找一些通用的東西。有沒有這種通用的方式來實現這一點?

周杰倫

+0

可能有興趣使用[Elastic Search插件](http://grails.org/plugin/elasticsearch)或[Elastic Search GORM插件](http://grails.org/plugin/elasticsearch-gorm)。 – dmahapatro

回答

1

For Grails 3.0。8+您可以試試這個grails-restsearch-plugin

它使用默認的GORM(不需要使用SOLR,ES或其他搜索引擎)向項目添加REST和搜索功能,但您可以忽略REST部分並僅使用搜索

2

我覺得這裏的問題是,搜索是一個相當大的領域。

如果你需要真正的搜索功能,你應該看看第三方搜索服務器,如solrelasticsearch和相應的Grails插件。這些產品爲您的數據創建一個單獨的索引,並提供諸如分面搜索,查詢輸入的拼寫建議,結果突出顯示等功能(並且具有高度可擴展性)。

但是,既然你提到你不想使用第三方庫,你可能會尋找更簡單的東西。

一個非常基本的解決問題的方法可能是這樣的:

class CustomerController extends RestfulController { 

    ... 

    def search(String property, String value) { 
    respond Customer.createCriteria().list { 
     like property, "%$value%" 
    } 
    } 
} 

這將創建一個Gorm criteria query與一個匹配SQL like條件的領域Customer對象的查詢。

調用帶有URL這個動作像

/customer/search?property=lastname&value=foo 

將返回所有的客戶提供包含foo一個lastname

您可以輕鬆地做出這個動作更通用通過使用addional參數領域類:

def searchWithClass(String className, String property, String value) { 
    def domainClass = grailsApplication.getDomainClass(className).clazz 
    respond domainClass.createCriteria().list { 
    like property, "%$value%" 
    } 
} 

現在,你可以把你想要使用className參數查詢域類:

.../searchWithClass?property=lastname&value=foo&className=foo.bar.Customer 

但使用這種方法時請記住一些事項:

  • SQL like查詢的性能可能不是最好的(尤其是如果您有非常大的文本字段)
  • 您只能使用這種方式查詢字符串字段。對於其他數據類型(如數字或日期),您需要不同的解決方案
  • 確保驗證並限制搜索參數。否則,可以查詢您應用程序中的每個域類。