Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用elasticsearch river插件索引couchdb文档的所有修订_Couchdb_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Couchdb,elasticsearch" /> elasticsearch,Couchdb,elasticsearch" />

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

如何使用elasticsearch river插件索引couchdb文档的所有修订,couchdb,elasticsearch,Couchdb,elasticsearch,我知道如何设置river插件并在其上搜索。问题在于,如果对同一文档进行多次编辑(多次修订),则保留来自最旧修订的数据,并丢失较旧的数据。我打算能够为我的整个couchdb保留所有修订的索引,因此我不必在couchdb上保留历史记录,也不必使用elasticsearch在文档上检索历史记录,而不必去futon。 我知道问题是在索引时为couchdb文档唯一地确定一个键,但是我们可以将“修订”号附加到键上,并且每个键都是唯一的 我在任何文档中都找不到这样做的方法。有人知道怎么做吗 欢迎提出任何建议/

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

我在任何文档中都找不到这样做的方法。有人知道怎么做吗

欢迎提出任何建议/想法

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

"_index": "foo",
"_type": "foo",
"_id": "27fd33f3f51e16c0262e333f2002580a",
"_score": 1.0310782,
"_source": {
    "barVal": "bar",
    "_rev": "3-d10004227969c8073bc573c33e7e5cfd",
    "_id": "27fd33f3f51e16c0262e333f2002580a",
{
    "type" : "couchdb",
    "couchdb" : {
        "script" : "ctx.doc.doc_rev_id = ctx.doc._id + '_' + ctx.doc._rev"
    }
}
这里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-for@dadoonet。希望这有帮助

这就是如何获得couchdb的所有旧版本信息。然后,您可以遍历可用的,并获取它们的数据和索引:

  • 获取文档id上所有修订的列表:

    curl http://:5984/testdb/cde07b966fa7f3243d33b8d1600ecd?revs_info=true {“_id”:“cde07b966fa7f32433d33b8d16000ecd”, “修订版”:“2-16e89e657d637c67749c8dd9375e662f”, “foo”:“bar”, “foo2”:“bar2”, “_revs_info”:[ {“修订版”:“2-16e89e657d637c67749c8dd9375e662f”, “状态”:“可用”}, {“修订版”:“1-4c6114c65e295552ab1019e2b046b10e”, “状态”:“可用”}]}

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

    curl http://:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?版本=1-4c6114c65e295552ab1019e2b046b10e
    {“_id”:“cde07b966fa7f32433d33b8d16000ecd”,
    “修订版”:“1-4c6114c65e295552ab1019e2b046b10e”,
    “foo”:“bar”}
    curl http://:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?版本=2-16e89e657d637c67749c8dd9375e662f
    {“_id”:“cde07b966fa7f32433d33b8d16000ecd”,
    “修订版”:“2-16e89e657d637c67749c8dd9375e662f”,
    “foo”:“bar”,
    “foo2”:“bar2”}
    
    我想你做不到。 就我所记得的,CouchDb不保存文档的旧版本。 压缩后,旧版本将被删除

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

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

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

    CouchDB河现在还没有做到这一点

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


    <>希望这有助于

    您可以考虑调整映射来从生成的字段中提取该子ID字段,例如从:

    然后“只是”修改河流以连接字符串,并将结果添加到
    my\u concat\u字段中的文档中。一种方法可能是使用couchdb河提供的方法。例如,类似这样的事情:

    "_index": "foo",
    "_type": "foo",
    "_id": "27fd33f3f51e16c0262e333f2002580a",
    "_score": 1.0310782,
    "_source": {
        "barVal": "bar",
        "_rev": "3-d10004227969c8073bc573c33e7e5cfd",
        "_id": "27fd33f3f51e16c0262e333f2002580a",
    
    {
        "type" : "couchdb",
        "couchdb" : {
            "script" : "ctx.doc.doc_rev_id = ctx.doc._id + '_' + ctx.doc._rev"
        }
    }
    

    您可以使用上面的snippit并
    将其放置到河流的端点,可能还有其他定义,例如通过
    curl-XPUT'localhost:9200/\u river/my\u db/\u meta'-d'
    。注意必要时避免引用。

    是的,这正是我想要的。我希望elasticsearch根据它从_changes流获取的couchdb文档的“_id”和“_rev”字段的组合创建“_id”。我知道这是一个自定义设置,但我相信我可以在ElastCasearch的代码库中更改它。我只是不知道这是否会破坏一些东西,我很好奇是否有人已经这样做了。而且,我尝试这样做的主要原因是为了不炸掉我的couchdb。所以每次创建一个新的文档并不能解决这个问题。我希望能够每天压缩couchdb,所有更改都将存储在elasticsearch上的索引中。我将查看一下,看看如何修改couchdb河以存储修订。谢谢,我将等待您的回复!我在这方面取得了一些进展,但我无法从CouchDb获得旧文档。我的意思是CouchDb似乎没有保存旧的文档。您如何设置CouchDb来保存文档(无论版本是什么)?您是否考虑过直接使用ES的版本功能,而不是滚动您自己的版本文档?例如,我确实研究了elasticsearch的版本控制,但这并不能解决问题,因为我无法检索/搜索旧版本,这正是我想要做的。>>>使用内置版本控制无法实现这一点。所做的只是存储当前版本号,以防止您无序应用更新。如果你想保持多个版本可用,那么你必须自己实现。参考:谢谢,我不知道你不能加载旧版本。真倒霉谢谢@Dave,我确实看了你建议的文档页面,但我不知道如何在通过river索引couchdoc时向其添加条目。您能否更具体地说明如何实现这一点?然后“只是”修改河流以连接字符串,并将结果添加到my_concat_字段中的文档中。我可以把你的答案标记为解决方案。@Sunny-我添加了一个例子,虽然它没有经过测试,但基本上是从文档中直接出来的。你能试试看吗?我对如何加载的解释有意义吗?我已经将相关信息作为问题的编辑(编辑2),这是mo