elasticsearch Logstash只将mysql中的一行select查询索引到弹性搜索,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch Logstash只将mysql中的一行select查询索引到弹性搜索,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch Logstash只将mysql中的一行select查询索引到弹性搜索

elasticsearch Logstash只将mysql中的一行select查询索引到弹性搜索,elasticsearch,logstash,elasticsearch,Logstash,我正在尝试使用logstash将数据从mysql数据库索引到elasticsearch。Logstash运行时没有出现错误,但问题是,它只索引了SELECT查询中的一行。 以下是我正在使用的软件版本: 弹性搜索:2.4.1 日志存储:5.1.1 mysql:5.7.17 jdbc_驱动程序_库:mysql-connector-java-5.1.40-bin.jar 我不确定这是否是因为logstash和elasticsearch版本不同 以下是我的管道配置: input { jdbc {

我正在尝试使用logstash将数据从mysql数据库索引到elasticsearch。Logstash运行时没有出现错误,但问题是,它只索引了SELECT查询中的一行。 以下是我正在使用的软件版本:

  • 弹性搜索:2.4.1
  • 日志存储:5.1.1
  • mysql:5.7.17
  • jdbc_驱动程序_库:mysql-connector-java-5.1.40-bin.jar
我不确定这是否是因为logstash和elasticsearch版本不同

以下是我的管道配置:

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.40-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "user"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "SELECT * FROM employee"
    use_column_value => true
    tracking_column => "id"
  }
}
output {
    elasticsearch {
        index => "logstash"
        document_type => "sometype"
        document_id => "%{uid}"
        hosts => ["localhost:9200"]
    }
}

您在
jdbc
插件中使用的
跟踪列(
id
)和
输出中的
文档id
uid
)似乎是不同的。如果两者都是相同的,因为通过
id
可以很容易地获取所有记录,并使用相同的
id
将它们推入ES,这看起来更容易理解:

document_id => "%{id}" <-- make sure you've got the exact spellings
此外,为了确保运行
logstash
文件时不存在
.logstash\u jdbc\u last\u run
文件,还包括以下行:

clean_run => true
因此,您的jdbc输入应该是这样的:

jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.40-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "user"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "SELECT * FROM employee"
    use_column_value => true
    tracking_column => "id"
    tracking_column_type => "numeric"
    clean_run => true
  }

除此之外,如果只想更新数据库表中新添加的记录,conf似乎还可以,除非您愿意选择where。希望有帮助

非常感谢您的回复。我对几件事不清楚。每次调度程序运行时,它是否会选择所有行并在ES中重新索引(我知道它不会重复,因为我们有跟踪列)?例如,我在表中最初有10行,它们在ES中被索引。在计划程序下次运行之前,将再添加5行。现在,调度器选择15行还是5行?我的理解是,如果在select查询中使用了sql\u last\u值,那么将选择5,否则将选择15。请澄清我的理解。@MaruthiPodila是的,没错。如果您的sql\u last\u值指向上次更新的id,则它将始终拾取调度程序再次运行时添加的最后5行。
jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.40-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "user"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "SELECT * FROM employee"
    use_column_value => true
    tracking_column => "id"
    tracking_column_type => "numeric"
    clean_run => true
  }