我使用的是Grails Searchable插件,现在我们已经切换到GORM MongoDB插件。 Searchable插件有一个方法search(),允许使用布尔连接器和通配符搜索所有字段。 Grails GORM MongoDB插件中是否有类似的方法?
如果没有,创建类似方法的最佳做法是什么?
答案 0 :(得分:1)
可搜索,以及Elasticsearch插件似乎依赖于Hibernate插件,不适用于MongoDB GORM。我使用低级API和mongo'$ regex'运算符为Mongo实现了一个简单的搜索服务:
以下是搜索名为“Page”
的域类的“content”属性的示例class SearchService {
static transactional = false
def query(String query){
return Page.collection.find( ['content':['$regex':query, '$options': 'i']]).collect({
it as Page
})
}
}
答案 1 :(得分:0)
基本上Lucas T提到的正则表达式搜索是构建灵活搜索的最佳方式,但我不建议使用ignore case正则表达式搜索('$ options':'i')。当使用ignore case时,mongodb无法使用索引,并且必须检查导致性能不佳的每个文档。
我的方法是在文档中添加一个新字段,用于存储每个文档的规范化搜索关键字。我通常通过降低案例并删除在正则表达式中难以处理的字符来规范化关键字 - 后者取决于您的数据和查询需求。与开头的正则表达式匹配也使用索引更高效。
请参阅页面末尾: http://docs.mongodb.org/manual/reference/operator/regex/