我知道如何设置河流插件并搜索它。问题是如果多次编辑同一文档(多次修订),则保留最旧版本的数据,丢失旧数据。我打算能够为我的整个couchdb保留一个索引所有修订版本,所以我不得不将历史保存在我的couchdb上并使用elasticsearch检索文档的历史记录而不必去蒲团。 我知道问题是在索引时唯一确定couchdb doc的密钥,但我们可以在密钥上附加“修订版”号,每个密钥都是唯一的。
我找不到在任何文档中这样做的方法。有没有人知道如何做到这一点。
欢迎任何建议/想法。
编辑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 - 希望这有助于解释弹性搜索没有使用新路径来定义其“_id”字段。
编辑3 - 为@dadoonet。希望这有帮助
这是你获取couchdb的所有旧版rev信息的方法。然后,您可以遍历可用的数据并获取其数据并将其编入索引:
获取有关文档ID的所有修订的列表:
卷曲http://:5984 / testdb / cde07b966fa7f32433d33b8d16000ecd?revs_info = true { “_id”: “cde07b966fa7f32433d33b8d16000ecd” “_rev”: “2-16e89e657d637c67749c8dd9375e662f” “富”:“酒吧”, “foo2的”: “BAR2” “_revs_info”: { “转”: “2-16e89e657d637c67749c8dd9375e662f” “状态”: “可用”}, { “转”: “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"}
答案 0 :(得分:2)
我认为你不能。 仅仅因为我记得,CouchDb不包含旧版本的文档。 在删除紧凑的旧版本之后。
即使在CouchDB中可行,也无法在Elasticsearch中存储不同版本的文档。
为此,您必须为新文档定义ID:例如: DOCID_REVNUM
这样,新版本不会更新现有文档。
到目前为止,CouchDB河并没有这样做。
我建议您在CouchDB中管理它(也就是为每个新版本的文档创建新文档),并让标准 CouchDB河将其作为另一个文档索引。
希望这有帮助
答案 1 :(得分:0)
您可以考虑调整映射以从生成的字段中提取_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"
}
}
你可以将上面的snippit和PUT
带到河流的终点,可能还有其余的定义,例如:通过curl -XPUT 'localhost:9200/_river/my_db/_meta' -d '<snippit from above>
。必要时要小心避开引号。