10521


ElasticsearchのRiverプラグインを使って定期的にMySQLからデータを取得したいと考えています。  
基本的にデータはMySQLに保存し、検索のみElasticsearchから取得するのが目的です。  
scheduleパラメータを使うと定期的にMySQLとコネクションするそうなので1時間ごとにMySQLと同期したいのですが、２回目以降の取得でデータが随時追加されていってしまいます。

例えば、articlesテーブルに10件しかデータがない場合、初回の取り込みは10件ですが、１時間後に２回目の取り込みをすると重複してるにも関わらずさらに10件取得してしまい、Elasticsearch側には20件ドキュメントが存在してしまいます。  
常にMySQLのレコード数と同期を取りたいのですがどうすればよいでしょうか？

以下MySQLからデータを取り込む設定です。

[code]

     {
       "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"
       }
     }
    
[/code]


CC BY-SA 3.0
2015-05-22T07:36:57.470
10496
2015-09-09T17:09:36.970
2015-09-09T17:09:36.970
754
3397
question
mysql elasticsearch
ElasticsearchのRiverプラグインで定期的にMySQLからデータ取り込みすると重複する


IDの指定がないためだと思います。

<https://github.com/jprante/elasticsearch-jdbc#how-to-fetch-a-table>  
こちらに記載があります。  
"If no _id column name is given, IDs will be automatically generated."

_idというカラム名（エイリアスでいいかと）をselectに追加するとうまくいくかと思います。

P.S.  
残念ながら、Riverの機能は現在、非推奨になってしまいました。  
<https://www.elastic.co/blog/deprecating_rivers>  
長期的な観点では、別の手段も検討されてはいかがでしょうか。


CC BY-SA 3.0
2015-05-22T16:37:25.830
10521
2015-05-22T16:37:25.830
2792
10496
answer