5

事前に計算されたスコアで注文された何百万ものアイテムがあります。各アイテムには多くのブール属性があります。Let によると、考えられる属性は全部で約 1 万あり、各アイテムには数十の属性があります。

任意の属性の組み合わせを指定して、上位 n 個のアイテム をリアルタイム(数ミリ秒) でリクエストできるようにしたいと考えています。

どのようなソリューションをお勧めしますか? 非常にスケーラブルなものを探しています。

--
- 現在、mongodbと配列インデックスを検討していますが、制限はありますか?
- SolR は可能なソリューションですが、テキスト検索機能は必要ありません。

4

3 に答える 3

9

このようにオブジェクトを保存した場合、Mongodbは必要なものを処理できます

{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... }

次に、次のクエリは、att1 と attr2 を持つすべてのアイテムに一致します。

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } })

しかし、これは一致しません

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } })

クエリはカーソルを返します。このカーソルを並べ替える場合は、次のように並べ替えパラメーターをクエリに追加するだけです

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1})

高度なクエリを見て、何が可能かを確認してください。

適切なインデックスは次のように設定できます

db.mycol.ensureIndex({attributes:1, score:1})

また、次を使用してパフォーマンス情報を取得できます

db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()

Mongo は、スキャンされたオブジェクトの数、操作にかかった時間、およびその他のさまざまな統計について説明します。

于 2012-05-01T07:05:57.823 に答える
2

これはまさに Mongo が対処できることです。属性がブール型であるという事実は、ここで役立ちます。考えられるスキーマを以下に示します。

[
    {
        true_tags:[attr1, attr2, attr3, ...],
        false_tags: [attr4, attr5, attr6, ...]
    },
]

次に、true_tagsfalse_tagsにインデックスを付けることができます。また、$in、$all、... クエリ演算子で検索すると効率的です。

于 2012-05-01T03:53:55.637 に答える
2

Redis は、

  • 「スコア順に並べられた数百万のアイテム」の「上位 n アイテム」

Redis には、開始できるデータ構造が組み込まれています: Sorted Set=> Sorted Set のすべてのメンバーはスコアに関連付けられています。たとえば、ZRANGEBYSCOREを使用してスコアでランク付けできます。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ソーテッド セットのコマンドを見て、Redis の感触をつかむことをお勧めします。これは、(記載されているように) 問題が要求するためです。もちろん、1 つの Set 要素内に好きなだけ属性を保持することもできます。


MongoDB に関しては、あなたが数百万に言及したので、増分クエリを曲げて問題を解決できない限り、1秒未満の応答は期待できません。

@nickdos が述べたように、Solr Relevancy は非常に強力な機能ですが、アイテムごとにすべての属性をメモリに保持する必要があるため、属性の数が問題になりますそれぞれに1ダースはそれほど悪くないかもしれませんが=>試してみてください.

于 2012-05-01T05:52:25.877 に答える