couchdb - 如何使用 elasticsearch river 插件索引 couchdb 文档的所有修订

标签 couchdb elasticsearch

我知道如何设置河流插件并搜索它。问题是如果多次编辑同一个文档(多个修订版),来自最旧修订版的数据会被保留,而旧数据会丢失。我打算能够为我的整个 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 的所有旧版本信息的方式。然后,您可以遍历可用的并获取它们的数据并为它们编制索引:
  • 获取 doc id 上所有修订的列表:

    curl 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"}
    

    最佳答案

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

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

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

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

    CouchDB 河现在还没有这样做。

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

    希望这可以帮助

    关于couchdb - 如何使用 elasticsearch river 插件索引 couchdb 文档的所有修订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15421720/

    相关文章:

    couchdb - pouchdb 会像 couchdb 一样留下已删除的墓碑吗?

    elasticsearch - Elasticsearch 日期范围查询

    elasticsearch - 对于每个国家/颜色/品牌组合,在 elasticsearch 中找到项目数量的总和

    couchdb - 如何在没有应用程序层的 CouchDB 中为每个新用户创建一个新数据库

    hosting - 设置 Mongo DB 和托管

    python - 也可以通过网络同步的小型 "embeddable"数据库?

    elasticsearch - 弹性 KNN 搜索候选数与分片大小

    elasticsearch - 将MariaDB中的多个表同步到Elasticsearch 7.5

    elasticsearch - 在script_score中使用嵌套值

    nosql - 使用 :group_level and :key 的 CouchDB 查询