私は、Morphia、MongoDB、およびドキュメント指向データベース全般にかなり慣れていません。次の問題に取り組む方法に関する一般的なガイダンスを探しています。
約 500K のBook
ドキュメントを含む DB があります。
{
"isbn" : "0-691-01305-5",
"title" : "For Whom the Bell Tolls",
"titleFTS" : [
"bell",
"toll" ],
"author" : "Hemingway, Ernest",
"ratingsCount" : 138,
"rating" : "3.5",
"sales" : 10245
"price" : "12.95",
"category" : "fiction",
"description" : "The story of a young American in the International Brigades attached to a republican guerilla unit during the Spanish Civil War.",
"descriptionFTS" : [
"story",
"young",
"americ",
"internat",
"brigade",
"attach",
"republic",
"guerilla",
"unit",
"spanish",
"civil",
"war"]
}
タイトル フィールドと説明フィールドに対して全文検索を実行する必要があります。そのために、およびフィールドの単語をそれぞれ含むtitleFTS
およびdescriptionFTS
配列を作成し、ストップ ワードをフィルター処理して、語幹処理を行いました。title
description
検索時にユーザーがキーワードを入力すると、入力したすべての用語に一致する書籍が返されます。たとえば、次のようになります。
db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})
これで問題なく動作しますが、ここで難しい問題に直面します。複数の基準に基づいて、上記のクエリの結果を並べ替えたいと考えています。そのような提案された順序の 1 つが次のとおりです。
titleFTS
とdescriptionFTS
フィールドの両方で検索語に一致する書籍titleFTS
フィールドのみ一致する本descriptionFTS
フィールドのみ一致する本- の数が最大の本
sales
- 最高の本
rating
- 最高の本
ratingscount
私たちのアプリは Java で書かれており、MorphiaDB API を使用しています。この種の Java Comparatorを非常に簡単に作成する方法を想像できますが、明らかに DB レベルでの順序付けを行いたいと考えています。
最後に質問があります。これは Morphia API を使用して実行できますか? または、DB.command() を使用して Javascript を記述する必要がありますか? Map/Reduce は必要ですか? もしそうなら、この問題に対して map/reduce を実装する方法についてのヒントが大いに役立ちます。