如果在插入请求后立即发送删除请求,则不会删除文档

时间:2017-08-30 08:11:22

标签: elasticsearch nest

我有一个索引文档的服务。 该服务接收以下两个请求 - 第一个是插入文档,第二个是删除它。 如果它们之间有一段时间它可以正常工作,但是当它们一个接一个地发送时,文档不会被删除。 我从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);

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

1 个答案:

答案 0 :(得分:0)

当您按照以下步骤插入任何文档时:

  1. 将文档添加到内存缓冲区并附加到translog。
  2. 刷新 内存缓冲区中的文档将写入新段,而不是 一个fsync。

    一个。该段被打开以使其可供搜索。

    湾内存缓冲区已清除。

  3. 打开细分以使其可供搜索。

  4. 每隔一段时间 - 例如当translog过大时 - 索引就是 酡;创建新的translog,并执行完整提交:

    一个。内存缓冲区中的任何文档都写入新段。

    湾缓冲区已清除。

    ℃。提交点将写入磁盘。

    d。文件系统缓存使用fsync刷新。

    即旧的translog已删除。

  5. Elasticsearch没有删除文档,它将文档标记为已删除的文档,并且在合并索引段时ES将已删除的文档留在内存中。

    所以我猜你删除后缺少刷新API。 如果您的DELETE API不是那么频繁,那么您可以通过调用REFRESH API调用DELETE API后刷新ES。

    如果您想了解有关索引如何在图片背后扯下的更多信息,请参阅此链接(https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html