【问题标题】:Can We Retrieve Previous _source Docs with Elastic Search Versions我们可以使用 Elastic Search 版本检索以前的 _source 文档吗
【发布时间】:2012-01-03 08:03:04
【问题描述】:

我已经阅读了关于 ES 的关于 versioning 的博文。

但是,我希望能够从更新中获取以前的“_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 很好地集成。)

【问题讨论】:

  • 您找到解决方案了吗?我决定选择 DrTech 建议的选项 1,但有搜索问题,其他人建议我使用第二个选项,但在使用 laravel elasticquent 为索引制作该数组时遇到问题。
  • @jones 我从事这个项目已经有一段时间了,但我从下面实现了 DrTech 的#3 解决方案。它对我来说完美无缺。每次更新对象时,首先将旧版本保存在不同的索引中。然后,您可以根据您的唯一标识符进行查询。

标签: elasticsearch


【解决方案1】:

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

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

对于低音量变化

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) 相同,但将旧版本存储在单独的索引中,因此保留您的“实时”索引,该索引将用于您的大多数查询,体积小且性能更高。

【讨论】:

  • 感谢您抽出宝贵时间回答这个问题。我实际上已经从更多的阅读中发现了这一点。我在其他一些网站上找到了解决方案#2,并打算这样做。但我认为您的解决方案 3 很棒。保持主索引干净整洁,但仍然能够轻松访问以前的版本。好点子!谢谢!
  • @swatkins 您能否链接到处理解决方案 2 的其他网站?
  • 取决于您的用例,但您可能需要添加“时间戳”字段来跟踪上次更新的日期。有了它,您只能检索在特定日期之后更新的对象。
  • 你提出了很好的解决方案,我选择了第一个选项,但是搜索有问题,如何在以前的里面搜索?
  • @jones 您正在寻找嵌套映射 - 在这里查看示例:elastic.co/guide/en/elasticsearch/reference/current/nested.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多