我使用以下设置在Elasticsearch中创建了一个索引。使用批量API将数据插入索引后,docs.deleted
计数不断增加。这是否意味着文档会自动被删除,如果是这样,我做错了什么?
PUT /inc_index/
{
"mappings": {
"store": {
"properties": {
"title": {
"type": "string",
"term_vector": "with_positions_offsets_payloads",
"store" : true,
"index_analyzer" : "fulltext_analyzer"
},
"description": {
"type": "string",
"term_vector": "with_positions_offsets_payloads",
"store" : true,
"index_analyzer" : "fulltext_analyzer"
},
"category": {
"type": "string"
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 5,
"number_of_replicas" : 1
},
"analysis": {
"analyzer": {
"fulltext_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"type_as_payload"
]
}
}
}
}
}
"GET /_cat/indices?v"
的输出如下所示,"docs.deleted"
不断增加:
health status index pri rep docs.count docs.deleted store.size pri.store.size
green open inc_index 5 1 2009877 584438 6.8gb 3.6gb
答案 0 :(得分:9)
如果您的批量操作还包括对现有文档的更新(插入/更新具有相同ID的文档),那么这是正常的。在Elasticsearch中,更新是删除+插入操作的组合:https://www.elastic.co/guide/en/elasticsearch/guide/current/update-doc.html
您看到的已删除文档中的文档标记为已删除。当Lucene段合并发生时,已删除的文档将从磁盘中物理删除。
答案 1 :(得分:2)
ElasticSearch索引由“段”组成。由于段具有“一次写入”策略,当我们从ElasticSearch删除/更新任何文档时,它实际上不会被删除,只会标记为已删除并增加“doc.deleted”中的计数。
分段越多意味着搜索速度越慢,使用的内存越多。 Elasticsearch通过在后台合并段来解决此问题。小段合并为更大的段,而这些段又合并为更大的段......如果有任何文档被标记为已删除,则合并这些段时,它不会将该文档复制到更大的段中。合并完成后,旧段将被删除。这就是“doc.deleted”价值进一步下降的原因。
答案 2 :(得分:0)
如果您的计算机速度太慢,可能会发生这种情况
如果处理(批量)插入的速度太慢,例如当您的文档很大或一次文档太多时。
在减慢了索引编制过程之后,再也没有文档丢失了-仍然很奇怪为什么未插入文档的地方在“已删除”下,这在我看来确实是在处理的地方。
这是使用Elasticdump发生的,可以通过将--limit
选项设置为较小的数字来解决。