我覺得這裏的問題是,搜索是一個相當大的領域。
如果你需要真正的搜索功能,你應該看看第三方搜索服務器,如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
將返回所有的客戶提供包含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
查詢的性能可能不是最好的(尤其是如果您有非常大的文本字段)
- 您只能使用這種方式查詢字符串字段。對於其他數據類型(如數字或日期),您需要不同的解決方案
- 確保驗證並限制搜索參數。否則,可以查詢您應用程序中的每個域類。
可能有興趣使用[Elastic Search插件](http://grails.org/plugin/elasticsearch)或[Elastic Search GORM插件](http://grails.org/plugin/elasticsearch-gorm)。 – dmahapatro