2

我正在使用 jdbc River 来同步 Elasticsearch 和数据库。已知的问题是从数据库中删除的行仍保留在 ES 中,jdbc River 插件无法解决该问题。jdbc River的作者提出了解决问题的方法:

一个好的方法是窗口索引。每个时间范围(可能每天一次或 > 每周)都会为河流创建一个新索引,并添加到别名中。旧的 > 索引将在一段时间后被删除。此维护类似于 >logstash 索引,但它超出了河流的范围。

我的问题是,这意味着什么?

假设我在名为 table1 的数据库中有数百万行的表,我的尝试如下:

  1. 创建名为river1 的河流,索引为1。index1 包含 table1 的索引行。Index1 添加到别名。
  2. table1 中的一些行在白天被删除,所以每天晚上我都会创建另一条名为 river2 的河流,其中 index2 仅包含 table1 中现在存在的内容。
  3. 从别名中删除旧的 index1 并将 index2 添加到别名。
  4. 删除旧的 index1。

那是正确的方法吗?

4

2 回答 2

2

使用 _ttl 字段怎么样?在 SQL 语句中定义静态 _ttl,使其长于 SQL 更新频率。

当河流的运行频率超过 1 小时时,SQL 将是这样的:

"select '1h' as _ttl, some_id as _id, ..."

这样,当河流运行时 _ttl 会得到更新,但删除的行不会得到更新,并且会在 _ttl 过期时从 ES 中删除。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-ttl-field.html

于 2015-03-03T11:18:07.813 回答
0

是的,它可以使用 _ttl 字段来完成,但我使用脚本解决了它。

每天晚上的脚本都从索引表开始并为当天创建索引。索引可以持续几个小时。

另一个脚本定期读取输出localhost:9200/_river/jdbc/*/_state?pretty并检查所有河流是否已完成(通过检查 lastEndDate 字段的存在)。当所有河流都完成后,使用新创建的索引刷新别名。旧索引被删除。

于 2015-03-09T12:35:38.700 回答