【问题标题】:Document is not deleted if delete request was sent immediately after insert request如果在插入请求后立即发送删除请求,则不会删除文档
【发布时间】:2018-02-07 20:40:35
【问题描述】:

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

【问题讨论】:

  • 这个问题没有被接受的答案。你是如何解决这个问题的?
  • 如果我没记错的话,我没有使用 Elasticsearch 解决它。相反,我在缓存中将传入的请求保留了一小段时间,如果一个新的请求以相同的 id 到达,我删除了仍然在缓存中的先前实体

标签: elasticsearch nest


【解决方案1】:

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

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

    一个。该段已打开以使其对搜索可见。

    b.内存缓冲区被清除。

  3. 段已打开以使其对搜索可见。

  4. 每隔一段时间——比如当 translog 变得太大时——索引是 酡;创建一个新的translog,并执行一个完整的提交:

    一个。内存缓冲区中的所有文档都将写入一个新段。

    b.缓冲区被清除。

    c。将提交点写入磁盘。

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

    e。旧的translog被删除。

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

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

如果您想详细了解图片背后的索引是如何发生的,您可以参考此链接 (https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html)

【讨论】:

  • 在这种情况下,删除非常频繁。在其他情况下,我需要一次删除多个文档。我还应该使用刷新 api 吗?如果没有,我还能做什么?
  • 我刚刚尝试使用刷新 api ( await _client.RefreshAsync(new RefreshRequest(indices)) ) 但它没有帮助
  • ES 每秒都会刷新一次。所以可以让一个你两秒钟的睡眠,如果你的频率小于每秒一个文件,你可以刷新。但我的建议是睡一秒钟。
  • 这个问题的最终解决方案是什么?
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2014-01-07
  • 2022-12-12
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2017-08-05
相关资源
最近更新 更多