首页 > 解决方案 > 如何按计划更新 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"
    }
}

标签: postgresqlelasticsearchlogstashelk

解决方案


您的索引名称不会更改,因此每次添加新记录时,它都会添加到相同的索引中。

向索引添加日期时间后缀

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 从别名中删除当前索引并添加新创建的索引。


推荐阅读