我们可以使用弹性搜索版本检索以前的_source文档

swa*_*ins 47 elasticsearch

我已经阅读了有关版本控制的 ES博客文章.

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

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

{
    "name": "John",
    "age": 32,
    "job": "janitorial technician"
}
// this becomes version 1
Run Code Online (Sandbox Code Playgroud)

我将其更新为:

{
    "name": "John",
    "age": 32,
    "job": "president"
}
// this becomes version 2
Run Code Online (Sandbox Code Playgroud)

然后,通过ES中的版本控制,我能够获得对象的先前"作业"属性吗?我试过这个:

curl -XGET "localhost:9200/index/type/id?version=1"
Run Code Online (Sandbox Code Playgroud)

但这只会返回最新的_source对象(约翰是总统的那个).

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

DrT*_*ech 66

不,你不能使用内置版本控制.所有这一切都是存储当前版本号,以防止您不按顺序应用更新.

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

对于小批量更改:

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!' }},
  ]
}
Run Code Online (Sandbox Code Playgroud)

对于大量更改:

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您抽出宝贵时间来回答这个问题.我实际上从更多的阅读中发现了这一点.我在其他一些网站上找到了解决方案#2,并且会继续使用它.但我认为你的解决方案3很棒.保持主索引干净整洁,但仍能轻松访问以前的版本.很好的主意!谢谢! (7认同)
  • 根据您的用例,但您可能需要添加一个“时间戳”字段来跟踪上次更新的日期。有了它,您只能检索在特定日期之后更新的对象。 (2认同)