テキストインデックス
の使用を検討してください $text
検索
。正規表現を使用するよりもはるかに優れたソリューションになる可能性があります。ただし、テキスト検索ではスコアリングアルゴリズムに基づいてドキュメントが返されるため、探しているすべてのキーワードが含まれていない結果が得られる場合があります。
このフィールドにテキストインデックスを追加できない、または追加したくない場合は、これらの単語が表示される順序がわからないため、単一の正規表現を使用するのは非常に面倒です。書くことが不可能だとは言いませんが、正規表現の基準であっても、ひどい嫌悪感を覚えることになります。 $and
を使用すると、正規表現演算子を複数回使用する方がはるかに簡単です。 オペレーター。
また、単語が文字列の最初または最後にある場合、またはピリオドまたはコンマが後に続く場合、区切り文字としてスペースを使用すると失敗します。単語境界トークンを使用します(\b
)代わりに。
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
コレクションのすべてのドキュメントでこれらの3つの正規表現を実行するため、これは非常に遅いクエリであることに注意してください。これがパフォーマンスが重要なクエリである場合は、テキストインデックスが実際に機能しないかどうかを真剣に検討してください。これに失敗した場合、最後に把握するのは、documenttextfield
からキーワードを抽出することです。 誰かが検索できるフィールド(その中のすべての一意の単語である可能性があります)を新しい配列フィールドdocumenttextfield_keywords
、そのフィールドに通常のインデックスを作成し、を使用して、そのフィールドを検索します$all
オペレーター
(その場合、正規表現は必要ありません。)