插入后,文档会自动在Elasticsearch中删除

时间:2015-10-19 15:52:44

标签: elasticsearch

我使用以下设置在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

3 个答案:

答案 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选项设置为较小的数字来解决。