2012-10-03 11 views
5

私はmysql dbとelasticsearch dbを同期させて保持する方法を見つけようとしています。私はelasticsearchのためのjprante/elasticsearch-river-jdbcプラグインを使用してjdbc川をセットアップしました。私は以下のリクエストを実行する場合:elasticsearchとデータベースを同期させて保持

curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ 
"type" : "jdbc", 
"jdbc" : { 
    "driver" : "com.mysql.jdbc.Driver", 
    "url" : "jdbc:mysql://localhost:3306/MY-DATABASE", 
    "user" : "root", 
    "password" : "password", 
    "sql" : "select * from users", 
    "poll" : "1m" 
}, 
"index" : { 
    "index" : "test_index", 
    "type" : "user" 
} 
}' 

川はインデックスデータを開始しますが、一部のレコードのために私はorg.elasticsearch.index.mapper.MapperParsingExceptionを取得します。この問題に関するディスカッションはhereですが、この問題を回避する方法を知りたいと思います。

インデックスを作成しようとしている 'タイプ'のすべての 'フィールド'に対してexplicit mappingを作成することでこれを修正することは可能ですか?この問題を解決するにはより良い方法がありますか?

もう1つの質問は、jdbc-riverがデータベースを再度ポーリングするときに、(SQLクエリで指定された)データセット全体を再びESに再インデックスするようです。私は確信していませんが、これはelasticsearchが新しいデータを追加するだけでなく、既存のデータの変更を更新したいからです。テーブルのデータが静的な場合は、新しいデータのみをインデックスすることは可能ですか?

+0

[ElasticSearchがデータベースと同期していること]の複製可能性(http://stackoverflow.com/questions/11952558/ensuring-elasticsearch-is-in-sync-with-database) – mahemoff

答えて

5

デフォルトマッピングを見ましたか? http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping.html

ここでお手伝いできると思います。

データテーブルに挿入日付フィールドがある場合は、それを使用してインデックス化する必要があるものをフィルタできます。 https://github.com/jprante/elasticsearch-river-jdbc#time-based-selecting

HTH

を参照してくださいデビッド

0

弾性検索は、すべての川のシンクコンセプトを落としました。これは推奨されたパスではありません。通常、Elastic Searchのようなドキュメントストアに同じ正規化されたSQLテーブル構造を保持することは意味がありません。

商品がいくつかの属性を持つエンティティとしてあり、レビューが同じテーブルに複数ある可能性があるため、親エンティティテーブルとしての商品エンティティに関するレビューがあります。

名前を持つ単一のインデックスを作成することも、文書ストアで
Products(Id, name, status,... etc) 
Product_reviewes(product_id, review_id) 
Reviews(id, note, rating,... etc) 

はここProduct{attribute1, attribute1,... Product reviews[review1, review2,...]}

を含む製品は、このような設定で同期のアプローチであると言います。

仮定:

  1. SQLデータベース(レコードの本当の原因)
  2. 弾性検索やその他のNoSQL文書ストア

ソリューション:

  1. やいなや更新/更新は、JMS/AMQP /データベースキュー/ファイルシステムのイベント/イベントの発行で発生します。 emキュー/ Amazon SQSなど完全なプロダクトまたはプライマリオブジェクトID
  2. プライマリIDのみがキューにプッシュされるか、オブジェクトを取得する場合、キューコンシューマはWebサービスを呼び出してフルオブジェクトを取得する必要がありますそれぞれの変更をElastic search/NoSQLデータベースに送信します。
関連する問題