我试图用鸡蛋“弄湿我的脚趾”,并决定将食谱网站作为第一个项目。
我使用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;
}
}
答案 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。
更改您的config.groovy mirrorchanges = false和bulkIndexOnStartup = false
将mapwith属性添加到连接到mongodb的所有域类。 static mapWith =" mongo" static searchable = true
通过从bootstrap.groovy调用reindex()以及每次域都有更新事件时手动重新索引。 def domainList = DomainName.list() DomainName.reindex(domainList)
这是一个有用的链接,我提到虽然我没有实现兔子mq部分,因为我现在不需要它。希望这可以帮助。 http://spring.io/blog/2011/08/29/rabbitmq-enabling-grails-full-text-search-on-cloud-foundry/