-5

問題:
特徴ベクトルの巨大なテーブルがあります。ベクトルの各要素は、2 つの INTEGER で構成されます。次に例を示します。

-------------------------------------------------------------------------------
KEY |  VALUE
---------------------------------------------------------------------------------
    | f1    | f2    | f3    | f4    | f5       | f6       | f7    |  f8   | f9
---------------------------------------------------------------------------------
 1  | 13 42 |       | 546 43| 43 24 | 435  634 |          | 45  43|  4  5 | 5 647
 2  | 24 32 | 54 35 |       |       | 3124 32  | 454 3    | 4   5 |  12 1 |   
 3  | 3  1  | 54 32 |       | 43 24 |          | 31  2432 | 454 3 |  4  5 | 1 21    
---------------------------------------------------------------------------------

一意のキーを持つ約 1,200 万行と約 200 列 (= 400 サブ列) があるとします。ご覧のとおり、要素にその機能がない場合、ランダムな列の値が欠落している可能性があります。

== を実行するカスタムメイドの類似関数 f(vector1, vector2) を使用して、テーブルに対して行 X (テーブルに存在しない) をクエリして、上位 N (N = 10-20 の可能性がある) の最適な一致を検索します。さまざまな列のマッチングのさまざまな重みを考慮して、類似度スコアをチェックして返します。

質問:
NoSQL データベースに関して言えば、これにはどのような実装が最適だと思いますか? リアルタイムでクエリを実行したい。Hadoop で HBase (または Hadoop で MongoDB、どちらが良いでしょうか?) を使用し、MapReduce ジョブを記述してすべての行で類似関数を実行し、結果を取得することを考えています。Hadoop のバッチ処理の主力製品が優れたリアルタイム パフォーマンス (最大 2 秒) を提供してくれるかどうか心配です。私は Lucene の経験があまりありません。ここで役に立ちますか?

これとは別に、テーブル全体の MapReduce スキャンを回避し、何らかの方法で最適化する方法についてのアイデアはありますか?

4

1 に答える 1

0

何人かの友人から提案を受けた後、ElasticSearch に関するドキュメントを調べました。それは私のユースケースに最適なツールのようです。これは、このような検索/取得のニーズに合わせて構築されており、シャードはあらゆるものと同様に、巨大なデータを処理できます。すべきことは次のとおりです。

キー要素が _id フィールドで、各 f1、f2... フィールドが異なるフィールドとして、各行をドキュメントに格納します。ブースト フィールド機能を使用して、特定のフィールドの関連性を高めることができます (基本的には、より多くの重みをフィールドに割り当て、基本的に類似関数の必要性を排除します)。これはクエリ時間中にも実行できるため、ユーザーはユースケースに応じて重みを割り当てることができます。

このユースケースで機能する可能性のあるクエリの例を次に示します (テストされていません)。

{
  "query" : {
    "filtered" : {
        "and" : [
         {      
              "query" : {
                    "bool" : {
                         "should" : [
                              { "match" : { "f192" : { "boost" : 2,"query" : "232"} } },
                              { "match" : { "f16" : { "boost" : 1,"query" : "4324"} } },
                              { "match" : { "f25" : { "boost" : 0.2,"query" : "76783"} } },
                         ]
                    }
                }
         },
         {
              "exists" : { "field" : "f67" }
         }
       ]
    }
  }
}'
于 2013-07-22T19:59:31.307 に答える