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

Mei*_*Mei 5 elasticsearch nest

我有一项索引文档的服务。该服务收到以下两个请求 - 第一个是插入文档,第二个是删除文档。当它们之间有一段时间时,它工作正常,但当它们相继发送时,文档不会被删除。我从 Nest 得到的回应看起来很成功。

我的函数有点长,所以我只会在里面写插入和删除。如果需要更多信息,我将添加它(例如,如果插入,也会从所有其他可用索引中删除它,并根据需要插入一些映射)。

插入代码:

IBulkResponse res = await _client.IndexManyAsync(entities, index, type);
Run Code Online (Sandbox Code Playgroud)

删除代码:

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))));
Run Code Online (Sandbox Code Playgroud)

例如,这个集成测试不起作用:

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);
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*wal 0

当您插入任何文档时,会发生以下步骤:

\n
    \n
  1. 文档被添加到内存缓冲区并附加到 translog。

    \n
  2. \n
  3. 刷新\n内存缓冲区中的文档被写入新段,\n无需 Fsync。

    \n
    a. The segment is opened to make it visible to search.\n\nb. The in-memory buffer is cleared.\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 该段被打开以使其可以搜索。

    \n
  6. \n
  7. 每隔一段时间\xe2\x80\x94例如当translog变得太大时\xe2\x80\x94索引被刷新;创建一个新的 translog,并执行完整提交:

    \n

    A。内存缓冲区中的所有文档都会写入新段。

    \n

    b. 缓冲区被清除。

    \n

    C。提交点被写入磁盘。

    \n

    d. 文件系统缓存通过 Fsync 刷新。

    \n

    e. 旧的 translog 被删除。

    \n
  8. \n
\n

Elasticsearch 不会删除该文档。它将文档标记为已删除文档,并且在合并索引段时,如果已删除文档在内存中,ES 会留下已删除文档。

\n

所以我的猜测是你删除后缺少刷新API。\n如果你的DELETE API不是那么频繁,那么你可以在调用DELETE API后通过调用REFRESH API来刷新你的E​​S。

\n

如果你想了解更多关于图片背后索引是如何发生的,可以参考这个链接(https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html

\n