2

私は、MorphiaMongoDB、およびドキュメント指向データベース全般にかなり慣れていません。次の問題に取り組む方法に関する一般的なガイダンスを探しています。

約 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配列を作成し、ストップ ワードをフィルター処理して、語幹処理を行いました。titledescription

検索時にユーザーがキーワードを入力すると、入力したすべての用語に一致する書籍が返されます。たとえば、次のようになります。

db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})

これで問題なく動作しますが、ここで難しい問題に直面します。複数の基準に基づいて、上記のクエリの結果を並べ替えたいと考えています。そのような提案された順序の 1 つが次のとおりです。

  1. titleFTSdescriptionFTSフィールドの両方で検索語に一致する書籍
  2. titleFTSフィールドのみ一致する本
  3. descriptionFTSフィールドのみ一致する本
  4. の数が最大の本sales
  5. 最高の本rating
  6. 最高の本ratingscount

私たちのアプリは Java で書かれており、MorphiaDB API を使用しています。この種の Java Comparatorを非常に簡単に作成する方法を想像できますが、明らかに DB レベルでの順序付けを行いたいと考えています。

最後に質問があります。これは Morphia API を使用して実行できますか? または、DB.command() を使用して Javascript を記述する必要がありますか? Map/Reduce は必要ですか? もしそうなら、この問題に対して map/reduce を実装する方法についてのヒントが大いに役立ちます。

4

2 に答える 2

4

今のところ、Solr や ElasticSearch などの外部フルテキスト エンジンを強くお勧めします。全文検索に関連する MongoDB の機能は、実際の全文ソリューションにはまったく適していません。プレステミングなどを使用したアプローチは、単なる回避策です。MongoDB が適切なフルテキスト統合を提供しない限り、本格的で実用的なソリューションに関心がある場合は、外部ソリューションを使用してください。

于 2011-02-18T18:38:18.227 に答える
0

Lucene と solr を使用すると、数値範囲クエリや測地クエリなど、多くのフィールドに対して複雑なブールクエリを作成できます。

于 2011-02-20T13:18:24.597 に答える