我认为这里的问题是搜索是一个相当大的领域。
如果您需要真正的搜索功能,您绝对应该查看第三方搜索服务器,例如 solr 或 elasticsearch 以及相应的 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 查询的性能可能不是最好的(尤其是当您有非常大的文本字段时)
- 您只能使用这种方式查询字符串字段。对于数字或日期等其他数据类型,您需要不同的解决方案
- 确保验证和限制搜索参数。否则,可以查询应用程序中的每个域类。