【问题标题】:Grails 2.3.7 Rest API - Search/QueryGrails 2.3.7 Rest API - 搜索/查询
【发布时间】:2014-03-31 16:30:55
【问题描述】:

我正在使用 Grails 2.3.7。我通过覆盖 restfull 控制器接口将我的控制器公开为 REST 控制器。我的客户是 AngularJS。我的 CRUD 操作运行良好。我现在需要为各种对象编写搜索 API,例如搜索帐户名称和号码,或在客户电子邮件上搜索客户对象。

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

【问题讨论】:

标签: grails grails-orm grails-plugin grails-controller


【解决方案1】:

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

如果您需要真正的搜索功能,您绝对应该查看第三方搜索服务器,例如 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

将返回所有带有lastname 的客户,其中包含foo

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

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 查询的性能可能不是最好的(尤其是当您有非常大的文本字段时)
  • 您只能使用这种方式查询字符串字段。对于数字或日期等其他数据类型,您需要不同的解决方案
  • 确保验证和限制搜索参数。否则,可以查询应用程序中的每个域类。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2012-07-21
      • 2014-07-09
      • 2018-09-09
      相关资源
      最近更新 更多