3

ElasticSearch 用の JDBC プラグインを使用して MySQL データベースを更新しています。新しいレコードと変更されたレコードを取得しますが、MySQL から削除されたレコードは削除しません。それらはインデックスに残ります。

これは、川を作成するために使用するコードです。

curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{
    "type" : "jdbc",
    "jdbc" : {
        "driver" : "com.mysql.jdbc.Driver",
        "url" : "jdbc:mysql://localhost:3306/test",
        "user" : "test_user",
        "password" : "test_pass",
        "sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`",
        "strategy" : "simple",
        "poll" : "5s",
        "versioning" : true,
        "digesting" : false,
        "autocommit" : true,
        "index" : "headphones",
        "type" : "Account"
    }
}'

OSX Mountain Lion に自作経由で ElasticSearch をインストールしました。エラーや問題はなく、すべてが期待どおりに応答します。権限は問題ありません。ログにエラーはありません。

autocommit考えられる、 、versioningおよびのすべての組み合わせを削除し、含めました (そして true と false に設定しました) digesting。これは開発データベースなので、レコードが完全に削除され、キャッシュされず、ソフト削除されていないと確信しています。すべてのレコードを削除すると (つまり、リバーをそのままにして、ES でインデックス化されたものを削除するだけです)、次にリバーが更新されたときにレコードが再追加されないため、バージョン管理と削除に関して何かを見逃していると思います。 .

また、列を指定するさまざまな方法を試しました_id。呼び出し時に JSON を介して値があることを確認しました。

乾杯。

4

2 に答える 2

0

私はまだエラスティックに比較的慣れておらず、プロジェクトにjdbc Riverを使用していました。私が正しく理解していれば、必ずしもそうであるとは限りませんが、これがどのように機能するかです:

  1. データベースからすべての行 (リバーの SQL ステートメントで指定) をフェッチします。
  2. フェッチされたすべての行の (id、type、および index) からダイジェストを計算します (新しい行が追加された場合、または行が削除された場合、これは変更されるはずです)。
  3. すべての行について、ドキュメントのインデックスを再作成します。これにより、各ドキュメントのバージョンが自動的にインクリメントされます。
  4. _river インデックスに保存されている川のインクリメント バージョン (カスタム)
  5. #3 で計算されたダイジェストが _river インデックスに格納されているダイジェストと異なる場合:
    • 保管する
    • ハウスキーピング機能を実行します (バージョン番号が低いすべてのドキュメントを削除します)。

そのため、ハウスキーピングを実行したい場合は、バージョン管理を設定する必要があり、これは同様に設定する必要があるtrueことを意味します。digestingtrue

したがって、あなたの川は次のようになります。

curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{
    "type" : "jdbc",
    "jdbc" : {
        "driver" : "com.mysql.jdbc.Driver",
        "url" : "jdbc:mysql://localhost:3306/test",
        "user" : "test_user",
        "password" : "test_pass",
        "sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`",
        "strategy" : "simple",
        "poll" : "5s",
        "autocommit" : true,
        "index": {
          "index" : "headphones",
          "type" : "Account",
          "versioning" : true,
          "digesting" : true
        }
    }
}'

and は定義ではなく定義の一部であることに注意しversioningてくださいdigestingindexjdbc

于 2014-01-21T17:55:51.920 に答える