Grails 2.3.7 Rest API - 搜索/查询

时间:2014-03-31 16:30:55

标签: grails gorm grails-plugin grails-controller

我正在使用Grails 2.3.7。我通过覆盖restfull控制器接口将我的控制器暴露为REST控制器。我的客户是AngularJS。我的CRUD操作正常。我现在要求在各种对象上编写搜索API,例如搜索帐户名和号码,或者在客户电子邮件中搜索客户对象。

什么应该是编写此类搜索API的有效和最佳方式?我可以为每个搜索条件编写一个API,但是可以查找一些通用的东西,其中搜索条件可以作为JSON发布并应用于相应的资源对象。有没有这样的通用方法来实现它?

2 个答案:

答案 0 :(得分:2)

我认为这里的问题是搜索是一个非常大的领域。

如果您需要真正的搜索功能,您一定要查看第三方搜索服务器,例如solrelasticsearch以及相应的Grails插件。这些产品可以从您的数据中创建单独的索引,并提供分面搜索,查询输入的拼写建议,结果突出显示等功能(并且具有高度可扩展性)。

但是,既然您提到您不想使用第三方库,那么您可能正在寻找更简单的东西。

您问题的一个非常基本的解决方案可能是这样的:

class CustomerController extends RestfulController {

  ...

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

这会创建Gorm criteria query,查询Customer个对象,其字段与SQL like条件匹配。

使用类似

的网址调用此操作
/customer/search?property=lastname&value=foo

会返回包含lastname的{​​{1}}的所有客户。

通过使用域类的附加参数,您可以轻松地使此操作更通用:

foo

现在,您可以使用def searchWithClass(String className, String property, String value) { def domainClass = grailsApplication.getDomainClass(className).clazz respond domainClass.createCriteria().list { like property, "%$value%" } } 参数传递要查询的域类:

className

但是在使用这样的方法时要记住一些事情:

  • SQL .../searchWithClass?property=lastname&value=foo&className=foo.bar.Customer 查询的性能可能不是最好的(特别是如果你有非常大的文本字段)
  • 您只能使用这种方式查询字符串字段。对于其他数据类型,如数字或日期,您需要一个不同的解决方案
  • 确保验证并限制搜索参数。否则,可以查询应用程序中的每个域类。

答案 1 :(得分:1)

对于Grails 3.0.8+,您可以试试这个grails-restsearch-plugin

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