我正在显示一个包含User
个对象的表格。显示的信息是:
User.firstName
User.lastName
User.email
但是使用user.toString()
显示,结果如下:
Gordon, Tomas (gordon.tomas@company.com)
Hanks, Jessica (hanks.jessica@company.com)
我想在此列表中设置一个过滤器,以便人们搜索特定用户。这些是要求:
1) 1 search field only
2) generic text input
目前我执行以下操作来更新列表,而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()
搜索,但我还没想出怎么做..
有关如何正确过滤的任何想法?
答案 0 :(得分:1)
基本上你有两个选择:快速做或做得对。
快速)向您的域类添加一个字段,以包含您要搜索的字段值的串联,例如User.concatenated = 'Gordon Tomas gordon.tomas@company.com'
。然后你就可以解雇你的搜索:
def potentialUsers = User.withCriteria {
user.split( /\s+/ ).each{
ilike 'concatenated', '%' + it + '%'
}
}
正确)使用Lucene
或基于Lucene
的正确全文搜索框架,例如hibernate-search
或grails search plugin
或elastic search
来索引字段,所以你可以触发复杂的多字查询