2

新しいプロジェクトに取り組んでおり、ファイル データベース (CouchDB など) に格納できる逆インデックスを開発する必要があります。Ruby 1.8.7 でコーディングしています。

これは、転置インデックスの形式です。

{
    "en": {
        "#linux": {
            "re": 144,
            "patch": 142,
            "1": 55,
            "to": 53
            },
        "#something": {
            "word": 20
            }
        },
    "fr": {},
    "es": {}
}

CouchDB のようなものを使用して、次のような一連のチェックでエントリを作成できる方法が必要です。

  • 2 番目のハッシュ キー (つまり#linux) が作成されていない場合は、作成します。
  • 3 番目のハッシュ キー (つまりpatch) が作成されていない場合は、作成してその値を1
  • 同じ単語が再び出現するたびに、['en']['#linux']または変数が何であれ、繰り返し、カウント (最も右の値) を 1 ずつ増やします。

私は基本的なハッシュを使用するだけで問題を解決しましたが、スクリプトを約 1TB 以上のテキストを処理するように設定した場合、これらをメモリに保持してもあまりうまくいきません。

選択された回答

選択した回答は、これに最適です。唯一の違いは、構文のわずかな変更であり、次のように機能します。

@db.collection.update({"_id" => lang}, {"$inc" => {"#{tag}.#{word}" => 1}}, { :upsert => true })
4

1 に答える 1

3

CouchDBは、この仕事に最適なツールにはなりません。特に、ドキュメント(増分)が大きくならない高速更新には適していません。更新するたびに、ディスク上に新しいバージョンのドキュメントが作成されるため、データベースはかなり大規模になり、ディスクはビジー状態になります。

MongoDBを見ることをお勧めします。高速なインプレース更新、インデックス、およびより豊富なクエリ言語を備えています。例:

db.collection.update({_id: 'en'},
                     {$inc: {'linux.re': 1}},
                     true);

これにより、IDが「en」のドキュメントが検索され、その['linux']['re']フィールドがインクリメントされます。ドキュメントが見つから['linux']ない、存在しない、または存在しない場合、ドキュメントは['linux']['re']自動的に作成されます。これは、このDBの最もお気に入りの機能の1つです。

于 2012-02-04T19:46:55.840 に答える