postgresql - 如何按计划更新 Elasticsearch 中的数据?
问题描述
我在PostgreSQL数据库中有一个表。我想将该表中的数据插入到Elasticsearch的索引中。我需要按计划更新索引数据。换句话说,删除旧数据并插入新数据。我有这样的 Logstash配置文件,但它不会更新索引中的数据。它是插入数据,但同时我看到旧数据。因此,会出现重复数据。如何按计划正确更新 Elasticsearch 中的数据?
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://host:port/postgres"
jdbc_user => "postgres"
jdbc_password => "postgres"
jdbc_driver_library => "postgresql-42.2.9.jar"
jdbc_driver_class => "org.postgresql.Driver"
statement => "SELECT * FROM layers;"
schedule => "0 0 * * MON"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "layers"
}
}
解决方案
您的索引名称不会更改,因此每次添加新记录时,它都会添加到相同的索引中。
向索引添加日期时间后缀
index => "layers%{+YYYY.MM.dd}"
所以每个日期都会有一个新的索引。
现在进行搜索,创建一个别名,以便您始终可以在应用程序中使用相同的名称。例如:layers/_search
通过添加如下别名:
POST _aliases
{
"actions": [
{
"add": {
"index": "layers-2019.12.11",
"alias": "layers"
}
}
]
}
以上步骤是通过 kibana 或者您可以使用 http post。但是,我建议使用Curator 进行别名操作。这样,一旦 log stash 命令完成,您就可以运行 curator 从别名中删除当前索引并添加新创建的索引。
推荐阅读
- apache-spark - Spark中分区拼花文件的动态输出路径
- sql - 想取Sql中两列的差
- excel - VBA For 循环,其中每个答案必须 = True
- ios - ARWorldMappingStatus:如何改进扩展甚至映射?
- solr - 带有过滤构面的 Solr 嵌套构面
- javascript - 为什么我的 Angular 组件方法不起作用?
- javascript - 脚本中的结构我相信我错了。有耐心,我正在尝试将我的编码组织到我更好理解的地方
- c# - 从 8 位索引像素数组转换为位图对象
- arrays - 如何获得两个数组的公共序列?红宝石
- css - 显示块不工作没有浮动清除两者