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' operator を使用して、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
})
}
}
基本的に、Lucas T が言及した正規表現検索は、柔軟な検索を構築するための最良の方法ですが、大文字と小文字を無視する正規表現検索 ('$options': 'i') の使用はお勧めしません。ignore case を使用すると、mongodb はインデックスを使用できず、各ドキュメントをチェックする必要があるため、パフォーマンスが低下します。
私のアプローチは、ドキュメントごとに正規化された検索キーワードを格納する新しいフィールドをドキュメントに追加することです。私は通常、大文字と小文字を区別し、正規表現で処理するのが難しい文字を取り除くことで、キーワードを正規化します。後者は、データとクエリのニーズによって異なります。先頭に対する正規表現一致も、インデックスをより効率的に使用します。
ページの最後を参照してください: http://docs.mongodb.org/manual/reference/operator/regex/