elasticsearch 更新已使用logstash和filebeat上传的elasticsearch数据,elasticsearch,logstash,updates,filebeat,elasticsearch,Logstash,Updates,Filebeat" /> elasticsearch 更新已使用logstash和filebeat上传的elasticsearch数据,elasticsearch,logstash,updates,filebeat,elasticsearch,Logstash,Updates,Filebeat" />

elasticsearch 更新已使用logstash和filebeat上传的elasticsearch数据

elasticsearch 更新已使用logstash和filebeat上传的elasticsearch数据,elasticsearch,logstash,updates,filebeat,elasticsearch,Logstash,Updates,Filebeat,我们有一个问题:我们正在与货运代理filebeat使用logstash。我们已经上传了2100万个日志,现在我们在logstash中的配置文件中有了一个更改。我们不想删除所有数据并重新加载,所以我们想知道是否有方法更新字段。但我们不想更新每个字段,只要其中有特定的内容。 有人能帮我们吗?也许能给出一个代码示例? 谢谢你的帮助 { "_index": "logstash-2016.06.06", "_type": "log", "_id": "4f63b12b098bd5ff0

我们有一个问题:我们正在与货运代理filebeat使用logstash。我们已经上传了2100万个日志,现在我们在logstash中的配置文件中有了一个更改。我们不想删除所有数据并重新加载,所以我们想知道是否有方法更新字段。但我们不想更新每个字段,只要其中有特定的内容。 有人能帮我们吗?也许能给出一个代码示例? 谢谢你的帮助

    {
  "_index": "logstash-2016.06.06",
  "_type": "log",
  "_id": "4f63b12b098bd5ff02de89e7057347c8ea39ae96",
  "_score": null,
  "_source": {
    "message": "[06/Jun/2016:23:59:58 -0700] \"GET CFNetwork/758.4.3 Darwin/15.5.0\"",
    "@version": "1",
    "@timestamp": "2016-06-06T21:59:58.000Z",
    "type": "log",
    "fields": null,
    "beat": {
      "hostname": "xxx",
      "name": "xxx"
    },
    "source": "xxx",
    "offset": xxx,
    "input_type": "log",
    "count": 1,
    "host": "xxx",
    "iOSVersion": "Unknown",
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "@uuid": "79e6a34e-13e4-9b5b-467b3a1f04fa",
    "fingerprint": "xxx",
    "logDate": "06/Jun/2016:23:59:58",
    "timezone": "0700",
    "httpRequest": "GET",
    "network": "CFNetwork",
    "CFNetworkNumber": "758.4.3",
    "DarwinVersion": "Darwin",
    "darwinVersionNumber": "15.5.0"
  },
  "fields": {
    "@timestamp": [
      1465250398000
    ]
  },
  "sort": [
    1465250398000
  ]
}
因此,我们通过在logstash配置的匹配表中使用CFNetworkNumber和DarwinVersion来获得iOSVersion。在这个例子中,iOSVersion是未知的,因为这个组合还不在配置中。因此,我想在这个案例中添加一个新的例子,并更新这些文档,因为它是未知的,但在这个更改之后cas是已知的。因此,我在logstash配置中添加的是:

else if [darwinVersionNumber] == "15.5.0" { 
    if[CFNetworkNumber] == "758.4.3" {
        mutate{
            gsub => ["iOSVersion", "Unknown", "9.3.2"]
        }
    }
}

如果您使用的是ES2.x,那么只需使用端点即可使用以下查询更新这些文档

POST /logstash-*/_update_by_query
{
  "script": {
    "inline": "ctx._source.iOSVersion = '9.3.2'"
  },
  "query": {
    "bool": {
      "filter": [
        {"term": {"iOSVersion.raw": "Unknown"}},
        {"term": {"darwinVersionNumber.raw": "15.5.0"}},
        {"term": {"CFNetworkNumber.raw": "758.4.3"}}
      ]
    }
  }
}

如果您仍然使用ES 1.x,那么您可以使用执行相同操作的

您应该提供一个具体的示例。显示已在ES中的文档以及需要进行哪些更改?我添加了一个示例。好的,问题是
darwinVersionNumber
CFNetworkNumber
不在您的文档中,因此我不确定如何确定需要更新哪些文档。您的ES文档中还有其他字段可以使用吗?很抱歉,这是一个不好的示例,因为存在grokparsefailure。我改了!通常我们有两个字段!非常感谢!它可以工作(启用脚本后)!太棒了,很高兴它有帮助!