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
当您插入任何文档时,会发生以下步骤:
\n文档被添加到内存缓冲区并附加到 translog。
\n刷新\n内存缓冲区中的文档被写入新段,\n无需 Fsync。
\na. The segment is opened to make it visible to search.\n\nb. The in-memory buffer is cleared.\nRun Code Online (Sandbox Code Playgroud)\n该段被打开以使其可以搜索。
\n每隔一段时间\xe2\x80\x94例如当translog变得太大时\xe2\x80\x94索引被刷新;创建一个新的 translog,并执行完整提交:
\nA。内存缓冲区中的所有文档都会写入新段。
\nb. 缓冲区被清除。
\nC。提交点被写入磁盘。
\nd. 文件系统缓存通过 Fsync 刷新。
\ne. 旧的 translog 被删除。
\nElasticsearch 不会删除该文档。它将文档标记为已删除文档,并且在合并索引段时,如果已删除文档在内存中,ES 会留下已删除文档。
\n所以我的猜测是你删除后缺少刷新API。\n如果你的DELETE API不是那么频繁,那么你可以在调用DELETE API后通过调用REFRESH API来刷新你的ES。
\n如果你想了解更多关于图片背后索引是如何发生的,可以参考这个链接(https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html)
\n| 归档时间: |
|
| 查看次数: |
1403 次 |
| 最近记录: |