2017-08-30 81 views
2

我有一個索引文檔的服務。 該服務收到兩個以下請求 - 第一個是插入文檔,第二個是刪除它。 當它們之間存在一段時間時,它可以正常工作,但是當它們一個接一個地發送時,文檔不會被刪除。 我從Nest獲得的迴應看起來很成功。如果在插入請求後立即發送刪除請求,則文檔不會被刪除

我的功能很長,所以我只會寫入插入和刪除裏面。如果需要更多信息,我將添加它(例如,如果插入也會將其從所有其他可用索引中刪除,並在需要時插入一些映射)。

插入代碼:

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); 

版本:2.3.5 ElasticSearch,。 Net 4.6,Nest 2.4.6

回答

0

當您在以下步驟中插入任何文檔時:

  1. 將文檔添加到內存緩衝區並附加到translog。
  2. 刷新 內存緩衝區中的文檔被寫入到一個新的段,而沒有 fsync。

    a。該部分已打開,使其可以進行搜索。

    b。內存中的緩衝區被清除。

  3. 該部分已打開以使其可見。

  4. 每隔一段時間 - 例如當過度日誌變得太大 - 索引是 被刷新;創建新的超時日誌,並且執行完整的提交:

    a。內存緩衝區中的任何文檔都寫入新的段。

    b。緩衝區被清除。

    c。提交點寫入磁盤。

    d。文件系統緩存刷新fsync。

    e。舊的轉換日誌被刪除。

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(indices))),但它幫助 – Mei

+0

ES每秒刷新一次。因此,如果你說兩秒鐘就可以睡一覺,如果你的頻率小於每秒一個文件,你可以刷新。 但我的建議是睡一秒鐘。 –