我使用jdbc river同步Elasticsearch和数据库。已知的问题是从数据库中删除的行仍保留在ES中,jdbc river插件无法解决这个问题。 jdbc river的作者提出了解决问题的方法:
一种好的方法是加窗索引。每个时间范围(可能每天一次或每周一次)为河流创建一个新索引,并添加到别名中。旧的>索引将在一段时间后被删除。此维护类似于> logstash索引,但它超出了河流范围。
我的问题是,这对于精确的方式意味着什么?
假设我在数据库中有一个名为table1的表,有100万行,我的尝试如下:
这是正确的方法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
是的,可以使用_ttl字段完成,但我使用脚本解决了它。
每晚脚本都以索引表开始,并为该日创建索引。索引可以持续几个小时。
另一个脚本定期从localhost:9200/_river/jdbc/*/_state?pretty
读取输出并检查是否所有河流都已完成(通过检查lastEndDate字段的存在)。当所有河流都完成后,使用新创建的索引刷新别名。旧索引被删除。