对于我的网站,我需要做一个搜索机制,其中一些输入字段是:国家,城市,日期之间(有或没有年份字段),关键字等等。
我的问题是,用户必须决定他们想要搜索的内容。例如,如果他们想要引入日期,或日期和城市,或城市和关键字..等我真的不知道该怎么做,我的意思是,我知道如何一次搜索一件事,但我我不确定如何做到这一切。
a)我需要像这样的东西:(if-else,if-else)而不是为每个组合编写代码,或者有更简单的方法吗?
b)顺便说一下,我的搜索机制是按照以下方式完成的(我以前从未做过搜索机制,所以我不知道它是否是最好的方法,这里也会提出一些评论和建议):
class book{
String a
String b
...
Date z
String allAttributesTogether() {
a + b + c + ... + z
}
}
然后在我的控制器中,我做了一个双重的判断和交叉匹配的搜索引入的单词和allAttributesTogether()的结果。
感谢高级,VA
答案 0 :(得分:0)
查看过滤器窗格插件。
答案 1 :(得分:0)
当你说“搜索”时,我会想到搜索引擎。但我想你问的是查询数据库,对吗?
如果您正在谈论搜索机制,搜索引擎是一个很好的工具。您可以查看Lucene,Compass和ElasticSearch(ES)等等。 Compass和ES基于lucene,但在抽象级别上更高(更易于使用)。 我一直非常满意地使用ElasticSearch。
如果您正在讨论查询数据库,那么您可以动态地构建HQL查询。下面的方法应该在Controller中,因为它使用params属性。它没有测试好吗?
List allAttributesTogether() {
def query = " select book from Book book "
def queryParams = [:]
def needsAnd = false
if(params.a || params.b || params.z ){
query += " where "
}
if(params.a){
query += " book.a = :a "
queryParams['a'] = params.a
needsAnd = true
}
if(params.b){
if(needsAnd) query += " and "
query += " book.b = :b "
queryParams['b'] = params.b
needsAnd = true
}
if(params.a){
if(needsAnd) query += " and "
query += " book.z = :z "
queryParams['z'] = params.z
}
return Book.executeQuery(query, queryParams)
}
还有使用Criteria builder的替代方法。您还可以使用“if”将条款添加到Criteria子句中。