Grails2.3.7RESTAPI-搜索/查询

Grails2.3.7RESTAPI-搜索/查询,grails,gorm,grails-plugin,grails-controller,Grails,Gorm,Grails Plugin,Grails Controller,我正在使用Grails2.3.7。通过使用restfull控制器接口,我将我的控制器公开为REST控制器。我的客户是AngularJS。我的积垢处理很好。我现在需要在各种对象上编写搜索API,比如在帐户名称和号码上搜索,或者在客户电子邮件上搜索客户对象 编写这种搜索API的有效和最好的方法应该是什么?我可以为每个搜索条件编写一个API,但要寻找一些通用的东西,其中搜索条件可以作为JSON发布并应用于相应的资源对象。有没有这样的通用方法来实现这一点 Jay我认为这里的问题是搜索是一个相当大的领域

我正在使用Grails2.3.7。通过使用restfull控制器接口,我将我的控制器公开为REST控制器。我的客户是AngularJS。我的积垢处理很好。我现在需要在各种对象上编写搜索API,比如在帐户名称和号码上搜索,或者在客户电子邮件上搜索客户对象

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


Jay

我认为这里的问题是搜索是一个相当大的领域

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

然而,由于您提到不想使用第三方库,您可能正在寻找更简单的方法

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

class CustomerController extends RestfulController {

  ...

  def search(String property, String value) {
    respond Customer.createCriteria().list {
      like property, "%$value%"
    }
  }
}
这将创建一个查询
客户
对象的字段,该字段与条件匹配

使用url调用此操作,如

/customer/search?property=lastname&value=foo
将返回包含
foo
lastname
的所有客户

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

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
但在使用这种方法时,请记住以下几点:

class CustomerController extends RestfulController {

  ...

  def search(String property, String value) {
    respond Customer.createCriteria().list {
      like property, "%$value%"
    }
  }
}
  • SQL
    like
    查询的性能可能不是最好的(特别是如果您有非常大的文本字段)
  • 您只能使用这种方式查询字符串字段。对于数字或日期等其他数据类型,您需要不同的解决方案
  • 确保验证并限制搜索参数。否则,可以查询应用程序中的每个域类

对于Grails 3.0.8+您可以尝试

它使用默认GORM(不需要使用SOLR、ES或其他搜索引擎)将REST和搜索功能添加到项目中,但您可以忽略REST部分,只使用可能有兴趣使用或的搜索。