Grails可搜索

时间:2012-04-02 02:06:46

标签: grails gorm

我试图用鸡蛋“弄湿我的脚趾”,并决定将食谱网站作为第一个项目。 我使用grails 2.0.1并使用mongoDB GORM进行持久化,工作正常,并在我的模型中使用static Searchable = true进行搜索。

制作一个简单的搜索工具,我已经设法通过名称找到食谱:

def recipes = Recipe.withCriteria
{
    ilike('name', params.name)
}

食谱可以通过名字找到。我的问题是,我如何搜索成分名称以在搜索中标记为结果(关于下面的模型)? 来自PHP和MySQL,这就像使用连接或其他东西修改查询一样简单

我的模型如下:

class Recipe 
{
    String name;
    String method;
    Date dateAdded;

    static hasMany = [ingredients:Ingredient];    
    static Searchable = true;
    static constraints = 
    {
        name(blank:false, maxSize: 255)
        method(blank:false)
    }

    static mapping = 
    {
        sort dateAdded: "desc"
    }
}

class Ingredient 
{
    String name;

    static hasMany = [recipes:Recipe];
    static belongsTo = [Recipe]
    static constraints = 
    {
        name blank:false;
    }

    String toString()
    {
        return name;
    }
}

3 个答案:

答案 0 :(得分:2)

static searchable = true应为小写“s” - 请参阅http://grails.org/Searchable+Plugin+-+Mapping

但是Searchable插件不能与Mongo或其他NoSQL数据存储区一起使用。这是因为它是使用Hibernate事件实现的,以侦听与插入,删除和更新数据库行相对应的事件,并根据这些更改更新Lucene索引。由于混合中没有Hibernate,因此Searchable不会发现任何变化。

答案 1 :(得分:1)

你的.withCriteria搜索与可搜索的插件没什么关系 - 它只是一个普通的SQL搜索。

尝试类似

的内容
def recipes = Recipe.withCriteria
{
    or {
        ilike('name', params.name)
        ingredients {
            ilike('name', params.name)
        }
    }
}

以便在食谱和成分名称中搜索。

请参阅http://grails.org/doc/2.0.x/guide/GORM.html#criteria以获取更多帮助。

答案 2 :(得分:0)

Searchable Plugin与mongodb配合使用,但您需要手动配置并重新编制索引,因为默认行为是使用hibernate。

  1. 更改您的config.groovy mirrorchanges = false和bulkIndexOnStartup = false

  2. 将mapwith属性添加到连接到mongodb的所有域类。 static mapWith =" mongo" static searchable = true

  3. 通过从bootstrap.groovy调用reindex()以及每次域都有更新事件时手动重新索引。 def domainList = DomainName.list() DomainName.reindex(domainList)

  4. 这是一个有用的链接,我提到虽然我没有实现兔子mq部分,因为我现在不需要它。希望这可以帮助。 http://spring.io/blog/2011/08/29/rabbitmq-enabling-grails-full-text-search-on-cloud-foundry/