2017-08-30 20 views
2

ドキュメントをインデックスするサービスがあります。 サービスは、次の2つの要求を受け取ります。最初はドキュメントを挿入し、2番目はドキュメントを削除する要求です。 それらの間に時間があるとうまくいきますが、それらが次々に送信されるとき、文書は削除されません。 私はネストからの返答がうまくいくように見えます。挿入リクエスト直後に削除リクエストが送信された場合、ドキュメントは削除されません

私の機能は種類が長いので、私は挿入と削除を書くだけです。さらに情報が必要な場合は追加します(たとえば、挿入する場合は、他のすべてのインデックスから削除し、必要に応じてマッピングを挿入します)。

挿入コード:

IBulkResponse res = await _client.IndexManyAsync(entities, index, type); 

削除コード:たとえば

var termFilter = new List<Func<QueryContainerDescriptor<JObject>, QueryContainer>> 
     { 
      c => c.Terms(t => t.Field(ID_FIELD).Terms(ids)) 
     }; 

     await _client.DeleteByQueryAsync<JObject>(indices, types, d => d.Query(q => q.Bool(b => b.Must(termFilter)))); 

、この統合テストは動作しません:

var indices = new { "some_index_1", "some_index_2" }; 
var entity = new Entity { Action = ReplicationAction.INSERT, ... }; 
await elasticDal.Insert(new List { entity }, "some_index_1", "666", indices); 
entity.Action = ReplicationAction.DELETE; 
await elasticDal.Insert(new List { entity }, "some_index_1", "666", indices); 

バージョン:ElasticSearch 2.3.5、。ネット4.6、ネスト2.4.6

答えて

0

手順を実行した後に文書を挿入すると、次のような処理が行われます。

  1. ドキュメントはメモリ内バッファに追加され、translogに追加されます。
  2. リフレッシュ インメモリバッファ内のドキュメントは、 のfsyncなしで新しいセグメントに書き込まれます。

    a。セグメントを開いて検索可能にします。

    b。メモリ内バッファがクリアされます。

  3. セグメントを開いて検索できるようにします。

  4. translogが大きくなりすぎるなど、たぶん頻繁に - インデックスは です。新しいトランスログが作成され、完全なコミットが実行されます。

    a。インメモリバッファ内のドキュメントはすべて新しいセグメントに書き込まれます。

    b。バッファがクリアされます。

    c。コミットポイントはディスクに書き込まれます。

    d。ファイルシステムのキャッシュはfsyncでフラッシュされます。

    e。古いtranslogが削除されます。

Elasticsearchが文書を削除しません、それが削除された文書として文書をマークし、それならばメモリ内の文書を削除したインデックスセグメントのESの葉をマージ中。

私の推測では、削除後にリフレッシュAPIが表示されません。 DELETE APIがあまり頻繁でない場合は、REFRESH APIを呼び出してDELETE APIを呼び出した後にESをリフレッシュできます。

あなたはインデックスが絵の後ろhappingする方法について詳細を知りたい場合は、このリンクを参照することができます(https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html

+0

削除は、この場合には、かなり頻繁にあります。一度に多くのドキュメントを削除する必要がある場合もあります。私はまだリフレッシュAPIを使用する必要がありますか?もしそうでなければ、他に何ができますか? – Mei

+0

私はちょうどリフレッシュAPI(使用して_client.RefreshAsync(新しいRefreshRequest(インデックス))を使用してみましたが、それは助けを – Mei

+0

毎秒リフレッシュします。だから、あなたが2秒と言って、あなたの頻度が毎秒1文書未満の場合は、リフレッシュを置くことができるように眠ることができます。 しかし、私の提案は1秒間寝る。 –

関連する問題