我有一个索引文档的服务。 该服务接收以下两个请求 - 第一个是插入文档,第二个是删除它。 如果它们之间有一段时间它可以正常工作,但是当它们一个接一个地发送时,文档不会被删除。 我从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
答案 0 :(得分:0)
当您按照以下步骤插入任何文档时:
刷新 内存缓冲区中的文档将写入新段,而不是 一个fsync。
一个。该段被打开以使其可供搜索。
湾内存缓冲区已清除。
打开细分以使其可供搜索。
每隔一段时间 - 例如当translog过大时 - 索引就是 酡;创建新的translog,并执行完整提交:
一个。内存缓冲区中的任何文档都写入新段。
湾缓冲区已清除。
℃。提交点将写入磁盘。
d。文件系统缓存使用fsync刷新。
即旧的translog已删除。
Elasticsearch没有删除文档,它将文档标记为已删除的文档,并且在合并索引段时ES将已删除的文档留在内存中。
所以我猜你删除后缺少刷新API。 如果您的DELETE API不是那么频繁,那么您可以通过调用REFRESH API调用DELETE API后刷新ES。
如果您想了解有关索引如何在图片背后扯下的更多信息,请参阅此链接(https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html)