1

川のプラグインを設定して検索する方法を知っています。問題は、同じドキュメントが複数回編集 (複数のリビジョン) された場合、最も古いリビジョンのデータが保持され、古いデータが失われることです。カウチデータベース全体のすべてのリビジョンのインデックスを保持できるようにするつもりなので、カウチデータベースに履歴を保持したり、elasticsearch を使用してドキュメントの履歴を取得したり、布団に行く必要はありません。問題は、インデックス作成中にcouchdbドキュメントのキーを一意に決定することであることはわかっていますが、キーに「リビジョン」番号を追加すると、すべてのキーが一意になります。

ドキュメントでそれを行う方法を見つけることができませんでした。誰もそれを行う方法について考えを持っていますか。

どんな提案や考えも大歓迎です。

EDIT 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 のすべてのリビジョンのリストを取得します。

    curl http://:5984/testdb/cde07b966fa7f32433d33b8d16000ecd?revs_info=true {"_id":"cde07b966fa7f32433d33b8d16000ecd", "_rev":"2-16e89e657d637c67749c8dd9375e662", "foo", "2""" foo" "_revs_info":[ {"rev":"2-16e89e657d637c67749c8dd9375e662f", "status":"利用可能"}, {"rev":"1-4c6114c65e295552ab1019e2b046b10e", "status":"利用可能"}]}

そして、次の方法で各バージョンを取得できます (ステータスが利用可能な場合)。

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

2 に答える 2

2

私はあなたができるとは思わない。私が覚えている限り、CouchDbは古いバージョンのドキュメントを保持していません。コンパクトの後、古いバージョンは削除されます。

とはいえ、CouchDBで実行可能であったとしても、Elasticsearchに異なるバージョンのドキュメントを保存することはできません。

これを行うには、新しいドキュメントのIDを定義する必要があります。例:DOCID_REVNUM

そうすれば、新しいリビジョンは既存のドキュメントを更新しません。

CouchDBリバーは今のところそれをしていません。

これをCouchDBで管理し(ドキュメントの新しいバージョンごとに新しいドキュメントを作成することもできます)、標準のCouchDBRiverに別のドキュメントとしてインデックスを付けることをお勧めします。

お役に立てれば

于 2013-03-14T23:10:16.783 に答える
0

docsなど、生成されたフィールドから _id フィールドを取得するようにマッピングを調整することを検討してください。

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

次に、リバーを「ただ」変更して文字列を連結し、結果を のドキュメントに追加しmy_concat_fieldます。これを行う 1 つの方法は、couchdb リバーが提供するスクリプト フィルター プラグインを使用することです。たとえば、次のようなものです。

{
    "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 '<snippit from above>. 必要に応じて引用符をエスケープするように注意してください。

于 2013-03-15T02:07:00.070 に答える