Grails搜索机制

时间:2011-06-17 18:46:03

标签: search grails criteria

对于我的网站,我需要做一个搜索机制,其中一些输入字段是:国家,城市,日期之间(有或没有年份字段),关键字等等。

我的问题是,用户必须决定他们想要搜索的内容。例如,如果他们想要引入日期,或日期和城市,或城市和关键字..等我真的不知道该怎么做,我的意思是,我知道如何一次搜索一件事,但我我不确定如何做到这一切。

a)我需要像这样的东西:(if-else,if-else)而不是为每个组合编写代码,或者有更简单的方法吗?

b)顺便说一下,我的搜索机制是按照以下方式完成的(我以前从未做过搜索机制,所以我不知道它是否是最好的方法,这里也会提出一些评论和建议):

  class book{
    String a
    String b
    ...
    Date z

    String allAttributesTogether() {
    a + b + c + ... + z
    }

    }

然后在我的控制器中,我做了一个双重的判断和交叉匹配的搜索引入的单词和allAttributesTogether()的结果。

感谢高级,VA

2 个答案:

答案 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子句中。