elasticsearch 批量创建&;使用Logstash批量更新ElasticSearch索引文档,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 批量创建&;使用Logstash批量更新ElasticSearch索引文档,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 批量创建&;使用Logstash批量更新ElasticSearch索引文档

elasticsearch 批量创建&;使用Logstash批量更新ElasticSearch索引文档,elasticsearch,logstash,elasticsearch,Logstash,文档未得到更新,而是得到新创建的文档,而不是更新文档 公司ID是唯一的列 样本数据 公司名称、徽标外部、公司ID ABC有限公司,JPG,ABC000001 XYZ有限公司,巴布亚新几内亚,ABC000002 AAA有限责任公司,ABC000003 我能够创建索引和文档 问题是当我更新索引时,文档将被创建而不是更新。 例如。 之前 ABC有限公司,JPG,ABC000001 之后 ABCD有限公司,JPG,ABC000001 因此,仅应更新公司名称 1。使用以下代码成功创建索引:- BAT文件

文档未得到更新,而是得到新创建的文档,而不是更新文档

公司ID是唯一的列

样本数据

公司名称、徽标外部、公司ID

ABC有限公司,JPG,ABC000001

XYZ有限公司,巴布亚新几内亚,ABC000002

AAA有限责任公司,ABC000003

我能够创建索引和文档

问题是当我更新索引时,文档将被创建而不是更新。 例如。 之前 ABC有限公司,JPG,ABC000001

之后 ABCD有限公司,JPG,ABC000001

因此,仅应更新公司名称

1。使用以下代码成功创建索引:-

BAT文件

input {  
    jdbc {  
        jdbc_driver_library => "C:\sqljdbc_7.4\enu\mssql-jdbc-7.4.1.jre8.jar"  
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"  
        jdbc_connection_string => "jdbc:sqlserver://;user=;password=;"  
        jdbc_user => ""  
        jdbc_password => ""  
        statement => "SELECT COMPANY_NAME,LOGO_EXT,COMPANY_ID from dbo.CompanyMaster WITH(NOLOCK) ORDER BY COMPANY_NAME"  
    }  
}  
filter {}  
output {  
    stdout {  
        codec => json_lines  
    }  
    elasticsearch {  
        hosts => "http://localhost:9200"  
        index => "companylistindex"  
        document_id => "%{COMPANY_ID}"
        action => index
    }  
}  
cd C:\logstash-7.3.1\bin logstash-fc:\logstash.conf

C:\logstash.conf文件

input {  
    jdbc {  
        jdbc_driver_library => "C:\sqljdbc_7.4\enu\mssql-jdbc-7.4.1.jre8.jar"  
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"  
        jdbc_connection_string => "jdbc:sqlserver://;user=;password=;"  
        jdbc_user => ""  
        jdbc_password => ""  
        statement => "SELECT COMPANY_NAME,LOGO_EXT,COMPANY_ID from dbo.CompanyMaster WITH(NOLOCK) ORDER BY COMPANY_NAME"  
    }  
}  
filter {}  
output {  
    stdout {  
        codec => json_lines  
    }  
    elasticsearch {  
        hosts => "http://localhost:9200"  
        index => "companylistindex"  
        document_id => "%{COMPANY_ID}"
        action => index
    }  
}  
2。更新代码

input {  
    jdbc {  
        jdbc_driver_library => "C:\sqljdbc_7.4\enu\mssql-jdbc-7.4.1.jre8.jar"  
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"  
        jdbc_connection_string => "jdbc:sqlserver://;user=;password=;"  
        jdbc_user => ""  
        jdbc_password => ""  
        statement => "SELECT COMPANY_NAME,LOGO_EXT,COMPANY_ID from dbo.CompanyMaster WITH(NOLOCK) WHERE ModifiedOn>'2019-11-01'"  
    }  
}  
filter {}  
output {  
    stdout {  
        codec => json_lines  
    }  
    elasticsearch {  
        hosts => "http://localhost:9200"  
        index => "companylistindex"  
        document_id => "%{COMPANY_ID}"
    }  
}
请帮我更新文件


注意:如果不同,只需更新公司名称或徽标外部。COMPANY_ID是唯一的列。

除了@polymon Proton建议的注释外,您不再需要
2
输出部分。只需像下面这样的
1
部分即可:

output {  
    stdout {  
        codec => json_lines  
    }  
    elasticsearch {  
        hosts => "http://localhost:9200"  
        index => "companylistindex"  
        document_id => "%{COMPANY_ID}"
        action => "update"
        doc_as_upsert => "true"
    }  
}

这将负责索引和更新。

您需要使用。另外,阅读关于我添加了action=>“update”doc\u as\u upsert=>“true”,但公司ID仍然重复。它应该更新记录。新建索引时是否必须将{COMPANY_ID}标记为主键?我遗漏了什么吗…?看起来您有多个相同id的事件。您可能需要使用。另外,在sql端按id排序并将工作人员计数更改为1。我添加了action=>“update”doc\u as\u upsert=>“true”,但公司id仍然重复。它应该更新记录。新建索引时是否必须将{COMPANY_ID}标记为主键?我是不是遗漏了什么。。。?