57

我已经阅读了关于 ES 的关于版本控制的博文。

但是,我希望能够从更新中获取以前的“_souce”文档。

例如,假设我有这个对象:

{
    "name": "John",
    "age": 32,
    "job": "janitorial technician"
}
// this becomes version 1

我将其更新为:

{
    "name": "John",
    "age": 32,
    "job": "president"
}
// this becomes version 2

然后,通过 ES 中的版本控制,我是否能够获得对象以前的“作业”属性?我试过这个:

curl -XGET "localhost:9200/index/type/id?version=1"

但这只会返回最新的 _source 对象(John 担任总裁的对象)。

我实际上很想像 StackOverflow 那样实现版本差异方面。(顺便说一句,我使用弹性搜索作为我的主要数据库 - 如果有办法与其他 nosql 数据库一起使用,我很乐意尝试一下。最好是与 ES 很好集成的。)

4

1 回答 1

77

不,您不能使用内置版本控制来执行此操作。所做的只是存储当前版本号,以防止您无序地应用更新。

如果您想保持多个版本可用,那么您必须自己实现。根据您可能要存储的版本数量,您可以采用三种方法:

对于低音量变化

1) 将旧版本存储在同一个文档中

{ text: "foo bar",
  date:  "2011-11-01",
  previous: [
      { date: '2011-10-01', content: { text: 'Foo Bar' }},
      { date: '2011-09-01', content: { text: 'Foo-bar!' }},
  ]
}

对于大容量变化

2)添加一个current标志:

{
   doc_id:  123,
   version: 3,
   text:    "foo bar",
   date:    "2011-11-01",
   current: true
}

{
   doc_id:  123,
   version: 2,
   text:    "Foo Bar",
   date:    "2011-10-01",
   current: false
}

3) 与上面的 (2) 相同,但将旧版本存储在单独的索引中,因此保留将用于大多数查询的“实时”索引,该索引较小且性能更高。

于 2011-11-22T12:18:28.510 回答