5

我正在想办法让我的 mysql db 和 elasticsearch db 保持同步。我已经使用jprante / elasticsearch-river-jdbc插件为 elasticsearch 设置了一个 jdbc 河。当我执行以下请求时:

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. 好吧,这里有与此问题相关的讨论,但我想知道解决此问题的方法。

是否可以通过为我要索引的“类型”的所有“字段”创建显式映射来永久解决此问题,或者是否有更好的方法来解决此问题?

我的另一个问题是,当 jdbc-river 再次轮询数据库时,它似乎将整个数据集(在 sql 查询中给出)再次重新索引到 ES 中。我不确定,但是这样做是因为 elasticsearch 想要添加新数据以及更新现有数据中的任何更改吗?如果表的数据是静态的,是否可以只索引新数据?

4

2 回答 2

5

你看过默认映射吗? http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping.html

我认为它可以在这里帮助你。

如果您的数据表中有一个插入日期字段,您可以使用它来过滤您必须索引的内容。见https://github.com/jprante/elasticsearch-river-jdbc#time-based-selecting

高温高压

大卫

于 2012-10-04T06:11:40.147 回答
0

Elastic Search 完全放弃了河流同步的概念。这不是推荐的路径,因为通常在 Elastic Search 等文档存储中保持相同的规范化 SQL 表结构是没有意义的。

假设您将 Product 作为具有某些属性的实体,并将 Product 实体上的评论作为父子表,因为评论可以在同一个表上有多条。

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. Elastic Search 或任何其他 NoSql 文档存储

解决方案:

  1. 一旦更新/更新发生在 JMS/AMQP/数据库队列/文件系统队列/Amazon SQS 等中的发布事件/事件中,完整的产品或主要对象 ID(我建议只使用 ID)
  2. 如果仅将主 ID 推送到队列,则队列使用者应调用 Web 服务以获取完整对象,或者仅获取它自己的对象并将相应的更改发送到 Elastic search/NoSQL 数据库。
于 2017-05-31T07:51:58.190 回答