【发布时间】: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 的所有旧版本信息的方式。然后您可以遍历可用的数据并获取它们的数据并为它们编制索引:
-
获取文档 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