2016-11-03 5 views
0

ステータスを0から1に変更しているインデックスのドキュメントを更新しています。ステータス0のドキュメントを更新して再度クエリすると、同じ文書なので、私は同じことをやり直すことになります。この操作は2回または3回ランダムに繰り返されます。私がsettimeoutで同じ操作を行うと、それは繰り返されないので、弾力的な検索クライアントの一部にある程度の遅れがあるようです。この問題は、平均で約5500回実行される5000個のドキュメントを更新すると拡大されます。古い更新されていないドキュメントを返す更新後の弾性検索クエリ

function getData(){ 
    client.search({ 
     index: 'es_dummy', 
     type: 'log', 
     size: 1, 
     body: { 
      "query" : { 
       "match" : { 
        "status" : "0" 
       } 
      } 
     } 
    }, 
    function(err, resp){ 
     console.log(resp.hits.hits.length); 
     if(resp.hits.hits.length) 
      updateIndexData(resp.hits.hits, 0, resp.hits.hits.length); 
     else 
      console.log("done"); 
    }); 
} 
getData(); 
function updateIndexData(resp, index, length){ 
    client.update({ 
     index: 'es_dummy', 
     type: 'log', 
     id: resp[index]._id, 
     script: 'ctx._source.status = 1' 
    }, 
    function(err1, resp1){ 
     if(!err1 && resp1){ 
      console.log("updated" + " " + update); 
      var milliseconds = (new Date).getTime(); 
      console.log("time " + milliseconds); 
      update++; 
      getData(); 
     } 
     else 
      console.log(err1); 
    }) 

} 

答えて

0

インデックスを更新するのを待つ必要があります。インデックスの更新後、更新されたドキュメントが検索可能になります。

更新要求https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-refresh.htmlの後にインデックスを強制的に更新することができます。または、elasticsearch 5.0+を使用している場合は、wait_forパラメータを使用して、インデックスがスケジュール(1秒のデフォルト)でリフレッシュされるまで、リクエストをブロックすることができます。

関連する問題