【发布时间】:2018-11-29 04:32:54
【问题描述】:
我有一个 Oracle 数据库。 Logstash 从 Oracle 检索数据并将其放入 ElasticSearch。
但是当 Logstash 每 5 分钟进行一次计划导出时,ElasticSearch 充满了副本,导致旧数据仍然存在。这是一个明显的情况。在这 5 分钟内,Oracle 的状态几乎没有改变。假设 - 添加了 2-3 行,删除了 4-5 行。
我们如何在没有副本的情况下用新数据替换旧数据?
例如:
- 删除整个旧索引;
- 创建新的同名索引并进行相同的配置(nGram 配置和映射);
- 添加所有新数据;
- 等待 5 分钟,然后重复。
【问题讨论】:
-
您需要使用一个唯一的 ID,例如来自您的 Oracle 数据的 userid,并在摄取到 Elasticsearch 时将其用作文档 ID。这样,如果数据库中的同一行被更新,则 Elasticsearch 中的相应文档将被新数据覆盖。无论如何,新行都会作为新文档添加。但是,当从 Oracle 中删除行时,这不起作用,因为 logstash 无法读取被删除的数据。
-
请注意,篡改文档 _id 会导致性能下降,因为平衡分布(给定索引中跨分片的文档)将无法很好地工作。
-
@ibexit 是否记录在某处,或者您是根据个人经验发言?因为文档说
document_id属性对于覆盖 ES 中的现有条目很有用。见elastic.co/guide/en/logstash/current/… -
@ben5556:是的,这个选项在 ES-Output 插件中可用,在某些情况下非常方便。但是,这对您的 ES-Index 性能不利。请看一下:elastic.co/guide/en/elasticsearch/reference/6.5/… 和 github.com/elastic/elasticsearch/issues/5941 和 github.com/ppearcy/elasticflake 和 stackoverflow.com/questions/53214628/…
-
@ibexit 很高兴知道感谢分享
标签: elasticsearch logstash n-gram