【问题标题】:How do I index all the revisions of a couchdb doc using elasticsearch river plugin如何使用 elasticsearch river 插件索引 couchdb 文档的所有修订
【发布时间】:2013-03-03 12:53:00
【问题描述】:

我知道如何设置 River 插件并在其中进行搜索。问题是如果多次编辑同一个文档(多个修订版),来自最旧修订版的数据会被保留,而旧数据会丢失。我打算能够为我的整个 couchdb 保留所有修订的索引,因此我不必在我的 couchdb 上保留历史记录并使用 elasticsearch 在文档上检索历史记录,而不必去蒲团。 我知道问题将是在索引时唯一确定 couchdb 文档的键,但我们可以将“修订”号附加到键上,并且每个键都是唯一的。

我在任何文档中都找不到这样做的方法。有没有人知道如何做到这一点。

欢迎提出任何建议/想法。

编辑 1: 更明确地说,目前 elasticsearch 保存 couchdb 文档如下:

"_index": "foo",
"_type": "foo",
"_id": "27fd33f3f51e16c0262e333f2002580a",
"_score": 1.0310782,
"_source": {
    "barVal": "bar",
    "_rev": "3-d10004227969c8073bc573c33e7e5cfd",
    "_id": "27fd33f3f51e16c0262e333f2002580a",

这里来自 couchdb 的 _id 与搜索索引的 _id 相同。我希望搜索索引是来自 couchdb 的 concat("_id","_rev")。

编辑2:(在尝试@DaveS 解决方案后) 所以我尝试了以下方法,但它没有用 - 搜索仍然根据 couchdb 的 _id 索引它

我做了什么:

curl -XDELETE 127.0.0.1:9200/_all
curl -XPUT 'localhost:9200/foo_test' -d '{
  "mappings": {
    "foo_test": {
      "_id": {
        "path": "newId",
        "index": "not_analyzed",
        "store": "yes"
      }
    }
  }
}'

curl -XPUT 'localhost: 9200/_river/foo_test/_meta' -d '{
  "type": "couchdb",
  "couchdb": {
    "host": "127.0.0.1",
    "port": 5984,
    "db": "foo_test",
    "script": "ctx.doc.newId = ctx.doc._id + ctx.doc._rev",
    "filter": null
  },
  "index": {
    "index": "foo_test",
    "type": "foo_test",
    "bulk_size": "100",
    "bulk_timeout": "10ms"
  }
}'

在此之后,当我搜索我添加的文档时,我得到:

_index: foo_test
_type: foo_test
_id: 53fa6fcf981a01b05387e680ac4a2efa
_score: 8.238497
_source: {
    _rev: 4-8f8808f84eebd0984d269318ad21de93
    content: {
        foo: bar
        foo3: bar3
        foo2: bar2
    }
    _id: 53fa6fcf981a01b05387e680ac4a2efa
    newId: 53fa6fcf981a01b05387e680ac4a2efa4-8f8808f84eebd0984d269318ad21de93

@DaveS - 希望这有助于解释 elasticsearch 没有使用新路径来定义其“_id”字段。

编辑 3 - 用于@dadoonet。希望这会有所帮助

这是您获取 couchdb 的所有旧版本信息的方式。然后您可以遍历可用的数据并获取它们的数据并为它们编制索引:

  1. 获取文档 ID 上所有修订的列表:

    卷曲 http://:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?revs_info=true {"_id":"cde07b966fa7f32433d33b8d16000ecd", "_rev":"2-16e89e657d637c67749c8dd9375e662f", “富”:“酒吧”, "foo2":"bar2", “_revs_info”:[ {"rev":"2-16e89e657d637c67749c8dd9375e662f", “状态”:“可用”}, {"rev":"1-4c6114c65e295552ab1019e2b046b10e", “状态”:“可用”}]}

然后您可以通过(如果状态可用)检索每个版本:

curl http://<foo>:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?rev=1-4c6114c65e295552ab1019e2b046b10e
{"_id":"cde07b966fa7f32433d33b8d16000ecd",
 "_rev":"1-4c6114c65e295552ab1019e2b046b10e",
 "foo":"bar"}

curl http://<foo>:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?rev=2-16e89e657d637c67749c8dd9375e662f
{"_id":"cde07b966fa7f32433d33b8d16000ecd",
 "_rev":"2-16e89e657d637c67749c8dd9375e662f",
 "foo":"bar",
 "foo2":"bar2"}

【问题讨论】:

  • 您是否考虑过直接使用 ES 的版本功能,而不是滚动您自己的版本化文档?例如。 elasticsearch.org/blog/2011/02/08/versioning.html
  • 我确实查看了 elasticsearch 的版本控制,但这并没有解决问题,因为我无法检索/搜索旧版本,这是我想要做的。 >>>您不能使用内置版本控制来做到这一点。所做的只是存储当前版本号,以防止您无序地应用更新。如果您想保持多个版本可用,那么您必须自己实现。参考:stackoverflow.com/questions/8218309/…
  • 谢谢,我不知道你不能加载旧版本。无赖!

标签: couchdb elasticsearch


【解决方案1】:

我不认为你可以。 只是因为据我记得,CouchDb 不保存旧版本的文档。 压缩后,旧版本被删除。

也就是说,即使在 CouchDB 中可行,您也不能在 Elasticsearch 中存储文档的不同版本。

为此,您必须为新文档定义一个 ID:例如: DOCID_REVNUM

这样,新修订版不会更新现有文档。

CouchDB 河现在还没有这样做。

我建议您在 CouchDB 中进行管理(也就是为文档的每个新版本创建新文档),并让 标准 CouchDB River 将其作为另一个文档进行索引。

希望对你有帮助

【讨论】:

  • 是的,这正是我想要的。我希望elasticsearch根据它从_changes流中获取的couchdb文档的“_id”和“_rev”字段的组合来创建“_id”。我确实知道这是一个自定义设置,但我确信我可以在 elastcisearch 的代码库中更改它。我只是不知道这是否会破坏某些东西,并且很想知道是否有人已经这样做了。
  • 另外,我尝试这样做的主要原因是我不会炸毁我的 couchdb。因此,每次都创建一个新文档并不能解决它。我希望能够每天压缩couchdb,所有的变化都会存储在elasticsearch上的索引中。
  • 我会看看它,看看我们如何修改 couchdb 河来存储修订。
  • 谢谢,我会等你的回复!
  • 我在这方面取得了一些进展,但我无法从 CouchDb 获取旧文档。我的意思是 CouchDb 似乎没有保留旧文档。无论版本如何,您如何设置 CouchDb 以保留文档?
【解决方案2】:

您可以考虑调整映射以从生成的字段中提取 _id 字段,例如来自the docs

{
    "couchdoc" : {
        "_id" : {
            "path" : "doc_rev_id"
        }
    }
}

然后“只是”修改河流以连接字符串并将结果添加到my_concat_field 中的文档中。一种方法可能是使用 couchdb 河提供的script filter plugin。例如。像这样:

{
    "type" : "couchdb",
    "couchdb" : {
        "script" : "ctx.doc.doc_rev_id = ctx.doc._id + '_' + ctx.doc._rev"
    }
}

您可以将上面的代码片段和PUT 带到河流的终点,可能还有定义的其余部分,例如通过curl -XPUT 'localhost:9200/_river/my_db/_meta' -d '&lt;snippit from above&gt;。必要时注意转义引号。

【讨论】:

  • 谢谢@Dave,我确实看过你建议的那个文档页面,但不知道如何在通过河索引它时向沙发文档添加条目。您能否更具体地说明如何完成此操作 - 然后“仅”修改河流以连接字符串并将结果添加到 my_concat_field 中的文档中。我将能够将您的答案标记为那么解决方案。
  • @Sunny - 我添加了一个示例,虽然它未经测试,但它基本上直接来自文档。你能试一试,看看效果如何?我对如何加载它的解释有意义吗?
  • 我已将相关信息作为对问题的编辑(编辑 2),这样更具可读性。
  • 嗯,不知道哪里出了问题。如果您将脚本设置为 ctx.doc._id = ctx.doc._id + ctx.doc._rev 然后跳过 _id/path 映射更改怎么办?例如。只需覆盖传入文档中的 _id 字段即可。
  • 哈哈..我也试过了。 [84]:索引[foo_test],类型[foo_test],id [53fa6fcf981a01b05387e680ac4a2efa],消息[MapperParsingException[Failed to parse [_id]];嵌套:MapperParsingException [提供的 id [53fa6fcf981a01b05387e680ac4a2efa] 与内容不匹配 [53fa6fcf981a01b05387e680ac4a2efa5-2bfe470c3b93e970041d885bed436f4f]]; ]
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2012-03-02
  • 2015-02-06
相关资源
最近更新 更多