"テキストインデックス"
および
スキーマ定義にテキストインデックスを追加するのは非常に簡単です:
BookSchema.index(
{
"name": "text",
"description": "text",
"body": "text"
},
{
"weights": {
"name": 5,
"description": 2
}
}
)
これにより、フィールドに「設定」された重みを使用して簡単な検索を実行できます。
Book.find({ "$text": { "$search": "Holiday School Year" } })
.select({ "score": { "$meta": "textScore" } })
.sort({ "score": { "$meta": "textScore" } })
.exec(function(err,result) {
}
);
一致する各用語は、最も重要度が高く、出現回数が多いことが判明したフィールドと照合されます。
重みの割り当ては「インデックス」に添付されているため、定義は1回行われ、変更することはできません。もう1つの制限は、「テキスト検索」では「部分的な」単語を検索しないことです。たとえば、「ci」は「City」または「Citizen」と一致しません。そのような場合は、代わりに正規表現が必要になります。
それ以上の柔軟性が必要な場合、または一般的に結果の重み付けを動的に変更できる必要がある場合は、集計フレームワークやmapReduceなどが必要です。
ただし、集約フレームワークは、"論理"一致> 操作($match
を介してフィルタリングできます 演算子ですが、用語に対する「正規表現」の「論理的」一致ではありません。これが適切であれば、単一の単語と「完全な」一致で作業できます。
Book.aggregate(
[
{ "$match": {
"$or": [
{ "name": /Holiday/ },
{ "description": /Holiday/ },
{ "body": /Holiday/ }
]
}},
{ "$project": {
"name": 1,
"description": 1,
"body": 1,
"score": {
"$add": [
{ "$cond": [{ "$eq": [ "$name", "Holiday" ] },5,0 ] },
{ "$cond": [{ "$eq": [ "$description", "Holiday" ] },2,0 ] },
{ "$cond": [{ "$eq": [ "$body", "Holiday" ] },1,0 ] }
]
}
}},
{ "$sort": { "score": -1 } }
],
function(err,results) {
}
)
集計パイプラインはデータ構造を使用してクエリを実行するため、各例外の重みのパラメータを現在必要なものに変更できます。
MapReduceも同様の原則を共有しており、主要要素として発行された主キーの一部に計算された「スコア」を含めることができます。 MapReduceは、reduce関数にフィードするための最適化として、このキーによって発行されたすべての入力を自然にソートします。ただし、そのような結果をさらに並べ替えたり「制限」したりすることはできません。
これらは通常、自分のケースに最適なものを検討して決定するためのオプションです。