【问题标题】:Version conflict when using the delete method of elasticsearch-dsl使用elasticsearch-dsl的delete方法时的版本冲突
【发布时间】:2019-11-12 09:40:57
【问题描述】:

所以,我们在 Django 项目中使用了 elasticsearch,并且我们使用的是 elasticsearch-dsl python 库。

我们在生产中遇到以下错误:

ConflictError(409, '{"took":7,"timed_out":false,"total":1,"deleted":0,"batches":1,"version_conflicts":1,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[{"index":"events","type":"_doc","id":"KJ7SpWsBZnen1jNBRWWM","cause":{"type":"version_conflict_engine_exception","reason":"[KJ7SpWsBZnen1jNBRWWM]: version conflict, required seqNo [1418], primary term [1]. current document has seqNo [1419] and primary term [1]","index_uuid":"2-fSZILVQzuJE8KVmpLFXQ","shard":"0","index":"events"},"status":409}]}')

而且格式更好:

{
    "took": 7,
    "timed_out": false,
    "total": 1,
    "deleted": 0,
    "batches": 1,
    "version_conflicts": 1,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "failures": [
        {
            "index": "events",
            "type": "_doc",
            "id": "KJ7SpWsBZnen1jNBRWWM",
            "cause": {
                "type": "version_conflict_engine_exception",
                "reason": "[KJ7SpWsBZnen1jNBRWWM]: version conflict, required seqNo [1418], primary term [1]. current document has seqNo [1419] and primary term [1]",
                "index_uuid": "2-fSZILVQzuJE8KVmpLFXQ",
                "shard": "0",
                "index": "events"
            },
            "status": 409
        }
    ]
}

产生错误的代码是对 dsl delete 方法的调用:

connections.create_connection(
    hosts=[settings.ELASTICSEARCH_HOST],
    timeout=20,
)
search = EventDocument.search()
# The query is made by the django model's id
search.query('match', id=self.id).delete()

这是EventDocument的定义:

from elasticsearch_dsl import (
    Document,
    Integer,
)


class EventDocument(Document):
    id = Integer()
    # other fields

我们现在最大的问题是我们无法访问服务器,我们通过为错误配置的自动电子邮件收到了错误。所以我什至不知道如何重现它。

希望你能帮忙,谢谢。

【问题讨论】:

  • 你的回答没有用,这是一个关于与 ES 一起使用的特定库的问题,你只是从我当时已经阅读过的官方文档中复制粘贴的东西,你只是在尝试得到一个容易接受的答案。我不记得我是如何解决这个问题的,但这不是因为那个答案。

标签: python django elasticsearch elasticsearch-dsl elasticsearch-py


【解决方案1】:

此错误是由于您的文档中的版本冲突而发生的。来自 ES 官方文档

Elasticsearch 是分布式的。当文档被创建、更新或 已删除,新版本的文档必须复制到其他 集群中的节点。 Elasticsearch 也是异步的,并且 并发,这意味着这些复制请求是在 并行,并且可能不按顺序到达目的地。 Elasticsearch 需要一种方法来确保旧版本的 文档永远不会覆盖较新的版本。

this官方文档中详细了解如何在ES中处理version conflict http 409异常,该文档还解释了为什么会出现异常以及如何处理它的各种方法,并详细解释了这个概念。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2016-12-18
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多