質問

データのインデックスを作成しています。これには、多くのトリプレットを次の形式で保存する必要があります。 (document, term, weight). 。このような行を最大数百万行保存する予定です。現在、これをMySQLで単純なテーブルとして実行しています。ドキュメントと用語の識別子を、他のテーブルの外部キーではなく文字列値として保存しています。ソフトウェアを書き直して、データを保存するより良い方法を探しています。

HBase の動作方法を見ると、これはスキーマにかなりよく適合しているようです。たくさんのトリプレットを保存する代わりに、マッピングすることができます。 document{term => weight}.

これを単一ノードで実行しています, したがって、分散ノードなどは気にしません。MySQL は機能するのでそのまま使い続けるべきでしょうか、それとも HBase を試したほうが賢明なのでしょうか?Lucene がこれを全文インデックス作成に使用していることがわかります (これは私がやっていることと似ています)。私の質問は、単一の HBase ノードと単一の MySQL ノードをどう比較するかということです。私は Scala 出身なので、直接 Java API は JDBC や MySQL の各クエリの解析よりも優れているのでしょうか?

私の主な関心事は挿入速度です。これまでは挿入速度がボトルネックでした。処理後は、MySQL 内で実行したほうがよい計算を行う必要があるため、ライブクエリのためにデータを MySQL に戻すことになるでしょう。

私は両方のプロトタイピングを試してみますが、コミュニティがこれについて貴重な洞察を与えてくれると確信しています。

役に立ちましたか?

解決

作業に適したツールを使用してください。

ACID (原子性、一貫性、分離性、耐久性) とは対照的に、多くの反 RDBMS または BASE システム (基本的に利用可能、ソフト状態、最終的に整合性) があり、選択できます。 ここ そして ここ.

私は従来のRDBMSを使用しましたが、Clob/Blobを保存することはできますが、これらのオブジェクトを検索するために特別にカスタマイズされた組み込みインデックスはありません。

ドキュメントを挿入する際に、ほとんどの作業(見つかった各タプルの加重周波数を計算する)を行いたい。

また、の有用性をスコアリングする作業を行うこともできます。 各検索の後に (documentId,searchWord) のペアをそれぞれ追加します。

そうすることで、毎回より優れた検索を行うことができます。

また、各検索のスコアまたは重みを保存し、重み付けします 他の検索との類似性をスコアします。

一部の検索は他の検索よりも一般的であり、 ユーザーは、検索クエリを正しく表現していませんが、 をクリックして、一般的な検索を行います。

ドキュメントを挿入すると、検索の重みもいくらか変わります 索引。

考えれば考えるほど、解決策は複雑になっていきます。まずは良いデザインから始める必要があります。より多くの要因があなたの デザインは、より良い結果を予測します。

他のヒント

MapReduce はタプルを生成する優れた方法のように思えます。scala ジョブを jar ファイルに取り込むことができれば (私はこれまで scala を使用したことがなく、jvm n00b なのでわかりませんが)、それを送信して、それを実行するためのラッパーを少し書くだけで済みます。マップ上でクラスターを減らします。

完了後にタプルを保存する場合は、次のようなドキュメントベースのデータベースを検討することもできます。 モンゴデータベース タプルを保存するだけの場合。

一般的に、テキストに関してより統計的なことを行っているように思えます...自分で作成する代わりに、単純に lucene または solr を使用して実行することを検討したことがありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top