質問: ElasticsearchのRiverプラグインを使って定期的にMySQLからデータを取得したいと考えています。 基本的にデータはMySQLに保存し、検索のみElasticsearchから取得するのが目的です。 scheduleパラメータを使うと定期的にMySQLとコネクションするそうなので1時間ごとにMySQLと同期したいのですが、2回目以降の取得でデータが随時追加されていってしまいます。 例えば、articlesテーブルに10件しかデータがない場合、初回の取り込みは10件ですが、1時間後に2回目の取り込みをすると重複してるにも関わらずさらに10件取得してしまい、Elasticsearch側には20件ドキュメントが存在してしまいます。 常にMySQLのレコード数と同期を取りたいのですがどうすればよいでしょうか? 以下MySQLからデータを取り込む設定です。 ``` { "type" : "jdbc", "jdbc" : { "url" : "jdbc:mysql://localhost:3306/blog_name", "user" : "root", "password" : "password", "schedule" : "0 0 0-23 ? * *", "sql" : "select * from articles", "index" : "blog_name", "type" : "articles" } } ```
回答: IDの指定がないためだと思います。 こちらに記載があります。 "If no _id column name is given, IDs will be automatically generated." _idというカラム名(エイリアスでいいかと)をselectに追加するとうまくいくかと思います。 P.S. 残念ながら、Riverの機能は現在、非推奨になってしまいました。 長期的な観点では、別の手段も検討されてはいかがでしょうか。