Logstash/Elasticsearch JDBC document_id 对比 document_type?

Logstash/Elasticsearch JDBC document_id vs document_type?

因此,当我使用来自 logstash 的 JDBC 导入程序并导出到 elasticsearch 时,我试图围绕 document_type 与 document_id 进行比较。

我终于全神贯注于索引。但是让我们假装我是从 table 的传感器数据(如 temp/humidity/etc...)中提取的,这些数据具有传感器 ID 的...温度/湿度(与天气相关的数据)并记录了时间。 (原来这么大table)

而且我想经常每隔 X 轮询一次数据库。

在这种情况下,document_type 与 document_id 会是什么,这将针对 1 个索引存储(或任何您想调用的名称)。

document_type 与 document_id 让我感到困惑,尤其是在 JDBC 进口商方面。

如果我设置document_id说出我的主键,会不会每次都被覆盖?所以我每次只有一份数据文件? (这似乎毫无意义)

jdbc plugin 将创建一个 JSON 文档,每一列都有一个字段。因此,为了与您的示例保持一致,如果您拥有该数据,它将作为如下文档导入:

{
    "sensor_id": 567,
    "temp": 90,
    "humidity": 6,
    "timestamp": "{time}",
    "@timestamp": "{time}" // auto-created field, the time Logstash received the document
}

您说得对,如果您将 document_id 设置为主键,它会被覆盖。你可以忽略 document_id 除非你想更新 Elasticsearch 中的现有文档,我认为你不会想要处理这种类型的数据。让 Elasticsearch 为您生成文档 ID。

现在让我们谈谈document_type。如果要设置文档类型,则需要将 Logstash 中的 type 字段设置为某个值(该值将传播到 Elasticsearch)。所以Elasticsearch中的type field就是用来对相似文档进行分组的。如果您使用 jdbc 插件导入的 table 中的所有文档都属于同一类型(它们应该是!),您可以在 [=32] 中设置 type =] 像这样输入...

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "mysql"
    parameters => { "favorite_artist" => "Beethoven" }
    schedule => "* * * * *"
    statement => "SELECT * from songs where artist = :favorite_artist"
    ...
    type => "weather"
  }
}

现在,在 Elasticsearch 中,您可以通过为该类型设置 mapping 来利用 type 字段。例如你可能想要:

PUT my_index 
{
  "mappings": {
    "weather": { 
      "_all":       { "enabled": false  }, 
      "properties": { 
        "sensor_id":      { "type": "integer"  }, 
        "temp":           { "type": "integer"  }, 
        "humidity":       { "type": "integer" },
        "timestamp":      { "type": "date" }  
      }
    }
  }
}

希望对您有所帮助! :)