【问题标题】:Field-specific versioning in ElasticsearchElasticsearch 中的字段特定版本控制
【发布时间】:2016-01-29 16:06:43
【问题描述】:

有很多关于 Elasticsearch 如何支持文档级外部版本控制的文档。但是,如果想要进行部分更新(例如,对特定字段),在字段级别进行这种类型的版本检查会很有用。

例如,假设我有一个对象字段name,带有原始字段valuetimestamp。如果timestamp 值大于当前 Elasticsearch 中的值,我只希望部分更新成功。

有没有简单的方法来做到这一点?可以用脚本完成吗?还是有更标准的做法?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    是的,使用脚本非常简单。见这里https://www.elastic.co/guide/en/elasticsearch/reference/2.0/docs-update.html

    我在这里编写了一个示例来更新“value”字段,当且仅当指定的时间戳值(在参数 update_time 中给出)大于“timestamp”字段时。如果timestamp字段值小于update_time参数则更新,否则不更新。

    curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
        "script" : {
        "inline": "if(ctx._source.name.timestamp  > update_time){ ctx.op = \"none\"};   
        ctx._source.name.value = value;  ctx._source.name.timestamp = update_time;", 
        "params" : {
            "update_time" : 432422,
            "value": "My new value"
        }
    }
       }'
    

    如果需要,您可以在脚本中获取当前时间,而不是作为参数传递,例如:

    update_time = DateTime.now().getMillis()
    

    【讨论】:

    • 我已编辑以修复更新检查代码中的错误。
    • 如果另一个客户端在检查时间戳值和进行更新之间进行更新,是否存在数据丢失的风险?或者 ES 是否会认识到正在对文档的不同版本进行更新,而不是检索到的版本? This 似乎暗示了这一点,但想仔细检查一下。
    • 是的,如果发生这种情况,更新将失败(更新 API 在重新索引期间检查版本号是否匹配)。您可以在脚本中使用 sleep(milliseconds) 来测试它。
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多