我使用的是 Grails Searchable 插件,现在我们切换到了 GORM MongoDB 插件。Searchable 插件有一个方法 search() 允许使用布尔连接器和通配符搜索所有字段。Grails GORM MongoDB 插件中是否有类似的方法?
如果不是,创建类似方法的最佳实践是什么?
我使用的是 Grails Searchable 插件,现在我们切换到了 GORM MongoDB 插件。Searchable 插件有一个方法 search() 允许使用布尔连接器和通配符搜索所有字段。Grails GORM MongoDB 插件中是否有类似的方法?
如果不是,创建类似方法的最佳实践是什么?
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/