elasticsearch - 在logstash elasticsearch中将_Id设置为更新键
问题描述
我有一个索引如下:
{
"_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}"***
当我使用 document_id => "%{id}" 作为:实际:
{
"_index": "mydata",
"_type": "_doc",
"_id": "BuilbG0B1IIlyY9-4P7t",
"_score": 1,
"_source": {
"id": 1,
"age": 13,
"name": "Greg",
"updated_on": "2019-09-26T08:11:00.000Z",
"@timestamp": "2019-09-26T08:17:52.974Z",
"@version": "1"
}
}
复制:
{
"_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"
}
当我在 ES 中进行更新时,如何让它考虑现有的 _id 而不会创建重复值?我的期望是根据_id更新索引中的数据,而不是创建新的更新行。
解决方案
我建议使用id
而不是_id
document_id => "%{id}"
推荐阅读
- regex - Spyder 编辑器中的正则表达式替换不能像 Notepad++ 一样使用捕获组语法
- python - While Loop Wont Break in Python
- python-3.x - Stackdriver 日志记录遗漏日志条目
- javascript - jQuery in-viewport 未检测到多个视频
- node.js - 从观察者触发器使用 Node.js require() 重新加载模块
- r - R:使用管道 %>% 和 pkg::fo 导致错误“.::base 中的错误:未使用的参数”
- python-3.x - 将字段内容转换为 Pandas DataFrame
- emacs - emacs 中的“历史”文件在哪里?
- mysql - 如何从mysql多对多选择中将单个值分组为数组?
- c++ - 迭代模板 int