まず、Mongoは初めてです...
コンセプト:
- ユーザーは自然言語で画像を説明することができます。
- ユーザー入力を分割し、彼が説明した単語を単語と呼ばれるコレクションに保存します。
- ユーザーは、最もよく使用される単語を調べて、それらの単語を説明に追加できる必要があります。
- システムは(すべてのユーザーに対して)最もよく使用される単語を使用し、それらの単語を使用して画像を説明します。
私の言葉の文書(現在)は次のとおりです(例)
{
"date": "date it was inserted"
"reported": 0,
"image_id": "image id"
"image_name": "image name"
"user": "user _id"
"word": "awesome"
}
各単語をユーザーに関連付けることができるように、単語が複製されます...
問題:特定のユーザーによって作成されていない(画像を説明するために)最もよく使用される単語を知るために、Mongoクエリを実行する必要があります。(上記のポイント3を満たすため)
MapReduceアルゴリズムを見てきましたが、読んだところ、いくつかの問題があります。
- 結果を並べ替えることができません(使用頻度の高いものから使用頻度の低いものの順に並べ替えることができます)
- 何百万ものドキュメントでは、処理時間が長くなる可能性があります。
- 返される結果の数を制限することはできません
毎日特定の時間にタスクを実行して、特定のユーザーが特定の画像を説明するために使用していない単語のランクを(別のコレクションの)ドキュメントに保存することを考えました。これを300件の結果か何かに制限する必要があります(適切な制限に関するアイデアはありますか??)次のようなものです。
{
user_id: "the user id"
[
{word: test, count: 1000},
{word: test2, count: 980},
{word: etc, count: 300}
]
}
このソリューションで私が目にする問題は次のとおりです。
- 結果にはかなりの遅延があり、これは望ましくありません。
- すべてのユーザーに対してこのドキュメントを生成する際のサーバーの負荷が急増する可能性があります(実際、Mongoではこれについてほとんど知らないため、これは単なる仮定です)
たぶん、私のアプローチは意味がありません...そして、Mongoでの経験の欠如が、間違った「スキーマ設計」を指摘しているのかもしれません。
この種の問題に対する良いアプローチは何でしょうか?
大きな投稿をしてすみません、そしてあなたの時間と助けに感謝します!
João