web-dev-qa-db-ja.com

MongoDBおよびMongooseで全文検索を実行する最良の方法

私は数日からGoogleで検索しており、多くのことを試しましたが、それでもユーザーコレクションで適切な全文検索を実行できません。

ElasticSearchを試してみましたが、クエリとページネーションを行うのはかなり不可能でした...

ElMongo、mongoose-full-text、Mongoosasticなど、Mongooseの多くのプラグインを試しました。誰もが本当に文書化されていて、良い全文検索を実行する方法がわかりません。

だから、私のコレクションは通常のコレクションです:

user = {
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
}

単純なPOSTを含むページに検索入力があります。hello worldと入力すると、コレクションフィールド全体で検索クエリの一致する単語を検索し、結果を取得できます。

また、ページごとに10個のアイテムなどのページネーションを処理するオプションがあることも本当に素晴らしいでしょう...

これを達成するための最良のソリューションは何ですか? Mongoose、NodeJS、およびExpressJSでMongoDB 2.6。*を使用しています。

ありがとう。

62
Ayeye Brazo

テキストインデックス をMongooseスキーマ定義に追加して、 $text テキストインデックスに含まれるすべてのフィールドを検索するfindクエリの演算子。

たとえばnameprofile.somethingでテキスト検索をサポートするインデックスを作成するには:

var schema = new Schema({
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
});
schema.index({name: 'text', 'profile.something': 'text'});

または、インデックスにすべての文字列フィールドを含める場合は、'$**'ワイルドカードを使用します。

schema.index({'$**': 'text'});

これにより、次のようなページテキスト検索クエリを実行できます。

MyModel.find({$text: {$search: searchString}})
       .skip(20)
       .limit(10)
       .exec(function(err, docs) { ... });

詳細については、完全な MongoDB Text Indexes ドキュメントを参照してください。

133
JohnnyHK