如何在弹性搜索中检索版本为n的所有文档

时间:2016-03-03 11:06:29

标签: elasticsearch

ElasticSearch附带版本控制https://www.elastic.co/blog/versioning

也许我在这里误解了版本控制的含义。

我想查找版本1中的所有文档,以便我可以更新它们。

一种显而易见的方法是逐个浏览所有文档并选择版本1中的文档。

问题:

是否可以使用ONE查询检索版本1中的所有文档?

2 个答案:

答案 0 :(得分:2)

由于Elasticsearch的分布式特性,它需要一种方法来确保以正确的顺序应用更改。这就是 _version 发挥作用的地方。这是确保文档的旧版本永远不会覆盖新版本的内部方式。

您还可以使用 _version 作为确保您要删除/更新的文档在此期间未被修改的方法 - 这可以通过指定版本号来完成网址;例如,只有当索引中存储的文档的当前 _version 为5时,PUT /website/blog/1?version=5才会成功。

您可以在此处详细了解:Optimistic Concurrency Control

要回答你的问题,

  

是否可以使用ONE查询检索版本1中的所有文档?

答案 1 :(得分:0)

您可以使用脚本化的_reindex到一个空的临时索引中。然后,目标索引将仅包含具有_version=1的那些文档。

您还可以添加更多查询节,以限制原始输入(使用反向索引,速度更快),以及其他更轻松的条件(每个文档,更灵活)。

# ES5, use "source" i/o "inline" for later ES versions.
http POST :9200/_reindex <<END
{
  "conflicts": "proceed",
  "source": {
    "index": "your-source-index"
  },
  "dest": {
    "index": "some-temp-index",
    "version_type": "external"
  },
  "script": {
    "lang": "painless",
    "inline": "if(ctx._version!=1){ctx.op='delete'}"
  }
}
END