elasticsearch 在logstash elasticsearch中将_Id设置为更新密钥,elasticsearch,logstash,kibana,elastic-stack,elasticsearch,Logstash,Kibana,Elastic Stack" /> elasticsearch 在logstash elasticsearch中将_Id设置为更新密钥,elasticsearch,logstash,kibana,elastic-stack,elasticsearch,Logstash,Kibana,Elastic Stack" />

elasticsearch 在logstash elasticsearch中将_Id设置为更新密钥

elasticsearch 在logstash elasticsearch中将_Id设置为更新密钥,elasticsearch,logstash,kibana,elastic-stack,elasticsearch,Logstash,Kibana,Elastic Stack,我的索引如下: { "_index": "mydata", "_type": "_doc", "_id": "PuhnbG0B1IIlyY9-ArdR", "_score": 1, "_source": { "age": 9, "@version": "1", "updated_on": "2019-01-01T00:00:00.000Z", "id": 4, "name": "Emma", "@timestamp": "2019-09-26T07:09:11.947Z" } 因此,我的上传数

我的索引如下:

{
"_index": "mydata",
"_type": "_doc",
"_id": "PuhnbG0B1IIlyY9-ArdR",
"_score": 1,
"_source": {
"age": 9,
"@version": "1",
"updated_on": "2019-01-01T00:00:00.000Z",
"id": 4,
"name": "Emma",
"@timestamp": "2019-09-26T07:09:11.947Z"
}
因此,我的上传数据的logstash conf是输入的{

    jdbc {
        jdbc_connection_string => "***"
        jdbc_driver_class =>  "***"
    jdbc_driver_library => "***"
        jdbc_user => ***
        statement => "SELECT * from agedata WHERE updated_on > :sql_last_value ORDER BY updated_on"
    use_column_value =>true
        tracking_column =>updated_on
        tracking_column_type => "timestamp"
    }
}
output {
          elasticsearch { hosts => ["localhost:9200"] 
        index => "mydata" 
        action => update
            document_id => "{_id}"
            doc_as_upsert =>true}
          stdout { codec => rubydebug }
       }
因此,当我在同一行中的任何更新之后运行它时,我的预期输出是为我在该行中所做的任何更改更新现有的_id值。 但是我的Elasticsearch将它作为一个新行进行索引,其中我的_id被视为一个字符串

"_index": "agesep",
"_type": "_doc",
"_id": ***"%{_id}"***
当我将文档_id=>“%{id}”用作以下内容时,会发生重复: 实际:

重复:

{
"_index": "mydata",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"age": 56,
"@version": "1",
"id": 1,
"name": "Greg",
"updated_on": "2019-09-26T08:18:00.000Z",
"@timestamp": "2019-09-26T08:20:14.561Z"
}
<> P>我如何考虑现有的SyID而不在ES中进行更新时创建重复值?
我的期望是基于_id更新索引中的数据,而不是创建新的更新行。

我建议使用
id
而不是
\u id

        document_id => "%{id}"

您在
“{u id}”
中缺少了一个
%
。您也尝试过
%{id}
而不是
%{u id}
@Val,我尝试过%{id},它是我表中的一列,但它仍然在为每次更新创建一个新的{id值,为id创建一个重复的新行。@Val,对不起,它第一次工作了,但现在又是`“u索引”:“agesep”、“\u type”:“\u doc”、“\u id”:“%{\u id}“,`,我不知道我的答案是什么,你需要使用
id
而不是
\u id
。没有
\u id
字段来自你的数据库是的,这是Logstash用来存储下一次运行的
sql\u last\u值的文件。只需删除它,删除
agesep
索引并重新启动Logstash即可
        document_id => "%{id}"