2

かなりの数のフィールド(必要に応じてプロパティ)を含むUserモデルオブジェクトがあります。「名」、「姓」、「都市」、「生年月日」と言います。各ユーザーは「一意のID」も取得します。

それらで検索できるようにしたいと思います。どうすればそれを適切に行うことができますか?どのようにそれを行うのですか?

私の理解(ほとんどすべてのKey-Valueストレージで機能します-最初にKey、次にValueになります)

u:123456789 = serialized_json_object

(ユーザーのキーの単純なプレフィックスとしての「u」、123456789は「一意のID」です)。

ここで、名と姓で検索できるようにしたいと考えて、次の場所に保存できます。

f:スティーブ= u:384734807、u:2398248764、u:23276263 f:アレックス= u:12324355、u:121324334

したがって、キーは「f」です。これは名のプレフィックスであり、「Steve」は実際の名です。「u:Steve」の場合、「Steve」であるすべてのユーザーIDを値として保存します。

これにより、すべての検索が非常に簡単になります。いくつかのフィールド(プロパティ)によるクエリ-たとえば、名(つまり「Steve」)と姓(つまり「l:Anything」)によるクエリはまだ簡単です-最初に「f:Steve」からユーザーIDのリストを取得し、次に「l」からリストを取得します:Anything "、交差するユーザーIDを見つけてください。

問題(そしてかなりの数があります):

  1. ユーザーの保存、更新、削除は面倒です。それはアトミックで一貫した操作でなければなりません。また、値のサイズが特定の値に制限されている場合、(潜在的な)問題が発生します。そして、ここでの答えは本当にありません。ユーザーIDのリストを圧縮するだけですか?でも、あまりクールではありません。

  2. 検索する新しいフィールドを追加するID。最終的。「都市」で言います。「c:LosAngeles」= ...、「c:Chicago」= ...と同じように実行できますが、最初からこれらすべての「検索の選択肢」を予測していなかった場合は、次のようになります。夜の仕事など、既存のすべてのユーザーレコードを作成して、それらの「c:CITY」を更新できるようにするために...非常に大きな仕事です。

  3. ロックに関する問題。ユーザー「u:123」は自分の名前「Alex」を更新し、ユーザー「u:456」は自分の名前「Alex」を更新します。どちらも「f:Alex」をIDで更新する必要があります。つまり、上書きの問題が発生するか、1つの更新が別の更新を待機します(そして、それらが多数ある場合はイメージングしますか?!)。

それを行うための最良の方法は何ですか?多くの分野で検索したいということを念頭に置いて?

PSお願いします、質問はHBase / Cassandra / NoSQL/Key-Valueストレージについてです。お願いします-MySQLを使用してSELECTについて「読む」ためのアドバイスはありません。「後で」スケーリングの問題について心配します。私が私の質問を私がしたのとまったく同じようにしたのには理由があります。:-)

4

2 に答える 2

4

プロパティを直接クエリできることは、SQL から離れると失われる機能の 1 つであるため、レコードを検索できるように独自のインデックスを維持する方法が必要です。

データストアにインデックス作成またはアトミック リスト操作が組み込まれていない場合は、言及したロックの問題に対処する必要があります。ただし、インデックス作成は必ずしも同期である必要はありません。更新されたレコードのキューを維持してインデックスを再作成すると、2 を解決するために再利用できる 3 のソリューションが得られます。

特定の値のインデックス リストが大きすぎてシステムが 1 つのリストで処理できない場合は、ユーザーのリストをリストのリストに置き換えることができます。ただし、同じ値を持つレコードが多数ある場合は、特に有用な検索条件ではない可能性があります。

場合によっては便利なもう 1 つのオプションは、インデックス作成に別のシステムを使用することです。たとえば、メイン データストアのレコードにインデックスを付けるように lucene を設定できます。

于 2010-04-12T04:17:19.427 に答える
1

これをスケジュールどおりに実行される MapReduce ジョブとして実装したと思います。各検索語は、UID を参照する行キーになります。

Rowkey: uid1
profile:firstName: Joe
profile:lastName: Doe
profile:nick: DoeMaster

Rowkey: uid2
profile:firstName: Jane
profile:lastName: Doe
profile:nick: SuperBabe

MapReduse はすべての検索可能なプロパティにインデックスを付け、検索語を行キーとして追加します

Rowkey: Jane
ルックアップ:uid: uid2

Rowkey: Doe
lookup:uid: uid2, uid1

行キー: DoeMaster
ルックアップ: uid: uid1

..等

ここで、ユーザーの変更としてその場でインデックス リストを更新する必要がある場合は、インデックスから uid 値を削除して別の行キーに追加することにより、変更を直接インデックス ベースに書き込みます。これが同時に発生した場合は、一時的なロックを実装できます。

削除されるユーザーについては、ユーザーの状態を示す追加の属性を使用して、検索から除外することができます。

検索語を追加することはそれほど難しいことではありません。それは、インデックスを作成する名前:値だけであるためです。行キー/キーワードにタイプ属性を追加することで、検索をさらにフィルタリングすることもできます。つまり、boston - lookup:type: city です。

アイデアは、hbase 内に独自の行キー ベースの検索インデックスを維持することです。

于 2011-11-15T07:26:48.017 に答える