MongoDB全文検索ガイド
MongoDBは強力な全文検索機能を提供しており、Mongooseと組み合わせることでNode.jsアプリケーションに効率的な検索を実装できます。
ステップ
-
テキストインデックスの作成
- 検索対象のフィールドにテキストインデックスを作成します。これにより、MongoDBは検索クエリを高速に処理できます。
const mongoose = require('mongoose'); const articleSchema = new mongoose.Schema({ title: { type: String, index: 'text' }, content: { type: String, index: 'text' } }); const Article = mongoose.model('Article', articleSchema);
-
$text演算子の使用
$text
演算子を使用して、テキスト検索クエリを実行します。
const searchTerm = 'javascript node.js'; Article.find({ $text: { $search: searchTerm } }, (err, articles) => { if (err) { console.error(err); } else { console.log(articles); } });
高度な検索
- AND/OR検索
- フレーズ検索
- ダブルクォートでフレーズを囲むことで、正確なフレーズ検索ができます。
const searchTerm = '"full text search"';
- スコアリング
$meta
演算子を使用して、検索結果の関連度スコアを取得できます。
Article.find({ $text: { $search: searchTerm } }, { score: { $meta: 'textScore' } }).sort({ score: { $meta: 'textScore' } }).exec((err, articles) => { // ... });
考慮事項
- 大規模データセット
- クエリ最適化
- インデックスの適切な選択
const mongoose = require('mongoose');
const articleSchema = new mongoose.Schema({
title: { type: String, index: 'text' },
content: { type: String, index: 'text' }
});
const Article = mongoose.model('Article', articleSchema);
index: 'text'
:title
とcontent
フィールドにテキストインデックスを作成します。これにより、MongoDBはこれらのフィールドを全文検索の対象として認識します。mongoose.Schema
: Mongooseスキーマを定義します。
$text演算子を使用した検索
const searchTerm = 'javascript node.js';
Article.find({ $text: { $search: searchTerm } }, (err, articles) => {
if (err) {
console.error(err);
} else {
console.log(articles);
}
});
find()
: Mongooseのメソッドで、指定したクエリにマッチするドキュメントを検索します。$search
: 検索クエリを指定します。ここでは、javascript node.js
というキーワードで検索します。$text
: MongoDBのテキスト検索演算子です。
スコアリングによる関連度検索
Article.find({ $text: { $search: searchTerm } }, { score: { $meta: 'textScore' } }).sort({ score: { $meta: 'textScore' } }).exec((err, articles) => {
// ...
});
sort({ score: { $meta: 'textScore' } })
: スコアの高いドキュメントを上位にソートします。score: { $meta: 'textScore' }
: 検索結果の各ドキュメントにスコアを付与します。スコアが高いほど、検索クエリとの関連度が高いことを意味します。
ポイント
- 大規模なデータセットや複雑な検索要件の場合は、MongoDB Atlas Searchなどの高度な検索サービスを検討してください。
- スコアリング機能を活用することで、検索結果の関連度を考慮したランキングを実現できます。
$text
演算子と$search
演算子を使用して、柔軟なテキスト検索クエリを構築できます。- テキストインデックスは、全文検索のパフォーマンスを大幅に向上させます。
MongoDBとMongooseの組み合わせは、強力な全文検索機能を提供しますが、特定のユースケースやパフォーマンス要件によっては、他の手法を検討する価値があります。
テキストインデックスと$text演算子以外の方法
-
Lucene-like Syntax
- Luceneライクな構文を使用して、より高度な検索クエリを構築できます。
- ただし、MongoDBの標準的な機能ではないため、特定のドライバーやライブラリが必要になる場合があります。
-
正規表現
$regex
演算子を使用して、パターンマッチングによる検索を行います。- 柔軟な検索が可能ですが、パフォーマンスが低下する可能性があります。
Article.find({ title: { $regex: 'javascript' } }, (err, articles) => { // ... });
外部検索エンジンとの連携
- Elasticsearch
- Elasticsearchは、専用の全文検索エンジンであり、高度な検索機能を提供します。
- MongoDBのデータをElasticsearchにインデックスし、ElasticsearchのAPIを使用して検索を行うことができます。
- より複雑な検索クエリやファセット検索、地理空間検索などの機能が必要な場合に適しています。
Mongooseのプラグイン
- Mongoose-Search-Indexes
- Mongoose-Search-Indexesは、Mongooseのプラグインであり、Luceneライクな検索機能を提供します。
- インストールと設定が簡単で、使いやすいですが、パフォーマンスやスケーラビリティの面では、MongoDBのネイティブ機能に劣る場合があります。
選択基準
- 開発者のスキルとチームの好み
ElasticsearchやLucene-likeプラグインを使用するには、特定の知識やスキルが必要となります。 - パフォーマンス要件
大規模なデータセットやリアルタイム検索が必要な場合は、Elasticsearchが優れたパフォーマンスを提供します。 - 検索の複雑さ
シンプルなキーワード検索であれば、MongoDBのネイティブ機能で十分です。複雑な検索クエリやファセット検索が必要な場合は、ElasticsearchやLucene-likeプラグインが適しています。
javascript node.js mongodb