2017-03-27 3 views
0

私はnode.js/requestを使用して多数のアイテムを削り取り、フィールドをElasticSearchドキュメントにマッピングしています。重複する文書をElasticSearchに挿入しないようにする方法

{ id: 123456 } 

定期的に、私は「リフレッシュ」とオリジナルアイテムが使用できなくなっているかを確認しないしたいのですが、何らかの理由:オリジナルの文書が変更されないIDフィールドを持っています。現時点では、私は直接スクラップし、単にElasticに挿入するスクリプトを用意しています。

挿入を行う前に同じIDのアイテムが既に存在するかどうかを確認する方法はありますか?私は重複のトンで終わることを望んでいません。

答えて

1

がありますあなたのIDを文書_idとして使用していますか?私は*上書き*したくないよう

PUT your-index/your-type/123456/_create 
{ 
    "foo" : "bar", 
} 
0

バルクAPIを使用してデータをエラスティックにプッシュすると、インデックスアクションを実行してソースデータIDとして_idとして使用できます。その場合は弾性がドキュメントを作成または置き換えます(同じIDのドキュメントが存在する場合)。一括アクション

function createBulkBody(items, indexName) { 
    var result = []; 
    _.forEach(items, function(item) { 
    result.push({ 
     index: { 
     _index: indexName, 
     _type: item.type, 
     _id: item.ID 
     } 
    }); 
    result.push(item); 
    }); 
    return result; 
} 

そしてバルクAPIを使用してデータをプッシュし、

var body = createBulkBody(items, indexName); 
    esClient.bulk({ 
    body: body 
    }, function(err, resp) { 
    if (err) { 
     console.log(err); 
    } else { 
    console.log(resp); 
    } 
    }); 

希望のこれは、アイテムの存在を確認したい場合も

+0

は本当に助けにはならない。そして、それはあなたが特定のIDを持つ文書のみが作成されますが、上書きされないべきであることを指定することができoperation typeを使用して簡単にする必要があります、全く反対の –

0

を支援しますそれを挿入しようとすると、あなたはこの文書のためにあなたのdbを照会することができます。結果が空でない場合は、これはidの文書がすでに存在することを意味します。

q = {'term': {'id': '123456'}} 

私はそれが非常に時間がかかるだろうと仮定し、それは重複が挿入されないことを確認するための方法である:

は、あなたはそのためtermクエリを使用することができます。

0

あなたは、あなたが実行できるElasticsearch JavaScriptのAPIを使用していると仮定すると、get request on a known IDシンプル:404の応答ステータスが文書を示し

client.get({ 
    index: 'myindex', 
    type: 'mytype', 
    id: 1 
}, function (error, response) { 
    // ... 
}); 

まだ存在しません:

Example get request

関連する問題