【发布时间】:2011-11-16 22:19:24
【问题描述】:
我使用的是 Grails Searchable 插件,现在我们切换到了 GORM MongoDB 插件。 Searchable 插件有一个方法 search() 允许使用布尔连接器和通配符搜索所有字段。 Grails GORM MongoDB插件中是否有类似的方法?
如果不是,创建类似方法的最佳做法是什么?
【问题讨论】:
标签: grails plugins mongodb grails-orm searchable
我使用的是 Grails Searchable 插件,现在我们切换到了 GORM MongoDB 插件。 Searchable 插件有一个方法 search() 允许使用布尔连接器和通配符搜索所有字段。 Grails GORM MongoDB插件中是否有类似的方法?
如果不是,创建类似方法的最佳做法是什么?
【问题讨论】:
标签: grails plugins mongodb grails-orm searchable
Searchable 以及 Elasticsearch 插件似乎依赖于 Hibernate 插件,并且不适用于 MongoDB GORM。我使用低级 API 和 mongo '$regex' 运算符为 Mongo 实现了一个简单的搜索服务:
这是一个搜索名为“Page”的域类的“内容”属性的示例
class SearchService {
static transactional = false
def query(String query){
return Page.collection.find( ['content':['$regex':query, '$options': 'i']]).collect({
it as Page
})
}
}
【讨论】:
基本上,Lucas T 提到的正则表达式搜索是构建灵活搜索的最佳方式,但我不建议使用忽略大小写正则表达式搜索 ('$options': 'i')。当使用忽略大小写时,mongodb 无法使用索引,必须检查每个文档,导致性能不佳。
我的方法是在文档中添加一个新字段,在其中存储每个文档的规范化搜索关键字。我通常通过降低大小写并去除正则表达式中难以处理的字符来规范关键字 - 后者取决于您的数据和查询需求。正则表达式匹配开头使用的索引也更有效。
见页尾: http://docs.mongodb.org/manual/reference/operator/regex/
【讨论】: