我正在显示带有User
个对象的表。显示的信息是:
User.firstName
User.lastName
User.email
但通过使用user.toString()
显示,结果为以下输出:
Gordon, Tomas ([email protected])
Hanks, Jessica ([email protected])
我想在此列表上有一个过滤器,以允许人们搜索特定用户。这些是要求:
1) 1 search field only
2) generic text input
当前,我正在执行以下操作以更新列表,输入[w0]是owner
:
def user // input as string from the search field
def potentialUsers = User.withCriteria {
or {
ilike("firstName", '%' + user + '%')
ilike("lastName", '%' + user + '%')
ilike("email", '%' + user + '%')
}
}
[输入为only 1 word
时,效果很好。
但是我期望人们会这样搜索:
在我看来,最好的解决方法是直接在toString()
中搜索,但我还不知道该怎么做。。
关于如何正确过滤的任何想法?
基本上,这里有2个选项:快速执行或正确执行。
快速]将一个字段添加到您的域类中,以包含要搜索的字段值的串联,例如User.concatenated = 'Gordon Tomas [email protected]'
。那么您可以像这样触发搜索:
def potentialUsers = User.withCriteria {
user.split( /\s+/ ).each{
ilike 'concatenated', '%' + it + '%'
}
}
右)使用Lucene
或基于Lucene
的适当全文本搜索框架,例如hibernate-search
或grails search plugin
或elastic search
来索引字段,因此可以触发复杂的多字查询] >