我有一项为文档编制索引的服务。
该服务收到以下两个请求 - 第一个是插入文档,第二个是删除它。
当它们之间有一段时间时,它工作正常,但是当它们一个接一个地发送时,文档不会被删除。
我从 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
最佳答案
当您插入任何文档时,会发生以下步骤:
内存缓冲区中的文档被写入一个新的段,没有
一个 fsync。
一种。该段被打开以使其对搜索可见。
湾内存缓冲区被清除。
酡;创建一个新的 translog,并执行完整的提交:
一种。内存缓冲区中的任何文档都将写入一个新段。
湾缓冲区被清除。
C。提交点被写入磁盘。
d.文件系统缓存用 fsync 刷新。
e.旧的 translog 被删除。
Elasticsearch 不会删除文档,它会将文档标记为已删除的文档,并且在合并索引段时 ES 会在内存中保留已删除的文档。
所以我的猜测是您在删除后缺少刷新 API。
如果你的 DELETE API 不是那么频繁,那么你可以在调用 DELETE API 后通过调用 REFRESH API 来刷新你的 ES。
如果你想了解更多关于图片背后的索引是如何发生的,你可以引用这个链接 (https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html)
关于elasticsearch - 如果在插入请求后立即发送删除请求,则不会删除文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45955221/