elasticsearch 是否在所有查询匹配文档中添加新的不存在的嵌套字段?,elasticsearch,logstash,pipeline,logstash-configuration,elasticsearch,Logstash,Pipeline,Logstash Configuration" /> elasticsearch 是否在所有查询匹配文档中添加新的不存在的嵌套字段?,elasticsearch,logstash,pipeline,logstash-configuration,elasticsearch,Logstash,Pipeline,Logstash Configuration" />

elasticsearch 是否在所有查询匹配文档中添加新的不存在的嵌套字段?

elasticsearch 是否在所有查询匹配文档中添加新的不存在的嵌套字段?,elasticsearch,logstash,pipeline,logstash-configuration,elasticsearch,Logstash,Pipeline,Logstash Configuration,我用的是麋鹿7.12。 我的外部json: {"req-id":"Test9","process-code":"demo9","field1":1,"field2":"abc"} Elasticsearch文档: {"docid":"...", "h":{...},"a":{.

我用的是麋鹿7.12。
我的外部json:

{"req-id":"Test9","process-code":"demo9","field1":1,"field2":"abc"}
Elasticsearch文档:

{"docid":"...", "h":{...},"a":{...}}
预期产出:

{"docid":"...", "h":{...},"a":{...}, "externaldata":{"field1":1,"field2":"abc"}}
Logstash管道:

filter {
    elasticsearch {
        hosts => "http://localhost:9200/"
        user => elastic
        password => elastic
        index => "demo7"
        query => "h.req-id:%{[req-id]} AND h.process-code:%{[process-code]}"
        docinfo_fields => {
          "_id" => "docid"
        }
    }
    if ("_elasticsearch_lookup_failure" not in [tags]) {
        mutate {
            add_field => {"externaldata"=>{}}
            add_field => { "externaldatafield1" => "%{[field1]}" }
            add_field => { "externaldatafield2" => "%{[field2]}" }
        }
        mutate {
            rename => {
                "externaldatafield1" => "[externaldata][field1]"
                "externaldatafield2" => "[externaldata][field2]"
            }
        }
    }
}
output {
    elasticsearch {
        hosts => "http://localhost:9200/"
        user => elastic
        password => elastic
        index => "demo7"
        action => "update"
        doc_as_upsert => true
        document_id => "%{docid}"
    }
}
错误:

"error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [externaldata] of type [text] in document with id '901'. Preview of field's value: '{field1=1, field2=abcd}'"
我尝试了其他SO文章中的一些组合,以在事件中添加嵌套字段,但管道未能执行。请给我提供正确的语法。我的学习参考是

编辑1:
根据leandrojmp的评论,
GET/demo7/_映射的结果是:

"externaldata" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
在研究映射概念之后,我删除了索引并成功地重新执行了管道。

现在的问题是,只更新了两个查询匹配文档中的一个。 如何使用
externaldata
字段更新所有查询匹配文档?如果我应该使用任何循环/跳转代码,请提供参考

编辑2:

我最初关于附加字段和映射错误的问题由leandrojmp解决;因此接受了他们的回答。但多文档更新问题仍然存在。到目前为止,我理解应该使用“http”或“exec”插件而不是“elasticsearch”。

此错误意味着您的索引中已经有一个文档,其中字段
externaldata
的类型为
text
,而现在您正试图索引与
对象相同的字段

例如,如果在一个文档中有
externaldata
作为文本:

{ 
    "externaldata": "some string text value" 
}
在其他文档中,您有
externaldata
as和object:

{ 
    "externaldata": {
        "field1": "1",
        "field2": "2"
    }
}
这两个文档中的一个将被拒绝,这取决于您的映射。如果您没有明确应用映射,elasticsearch将使用它首先接收的类型为字段创建映射,在您的情况下,该类型似乎是
文本
类型

要解决此问题,您需要删除索引,并为字段
externaldata
应用索引,或为该字段为对象的文档编制索引

映射如下所示:

{
    "externaldata": {
        "properties: {
            "field1": { "type": "keyword" },
            "field2": { "type": "keyword" }
        }
    }   
} 
mutate {
    add_field => { "[externaldata][field1]" => "%{[field1]}" }
    add_field => { "[externaldata][field2]" => "%{[field2]}" }
}
如果数据中的文档中此字段不是对象,则需要更改其名称,不能将同一字段作为字符串和对象

另外,你的变异过滤器是错误的,你只需要这样的东西:

{
    "externaldata": {
        "properties: {
            "field1": { "type": "keyword" },
            "field2": { "type": "keyword" }
        }
    }   
} 
mutate {
    add_field => { "[externaldata][field1]" => "%{[field1]}" }
    add_field => { "[externaldata][field2]" => "%{[field2]}" }
}

嗨,谢谢你提供的所有细节。我在任何地方都没有“externaldata”字段——elasticsearch文档和外部json中都没有。我想在从外部json向匹配的ES文档插入2个新字段时创建它。是的,我尝试了您的组合,但得到了相同的错误。当您尝试为具有不同映射类型的字段编制索引时,将存在映射错误,索引中的字段
externaldata
映射为
text
,如果发生这种情况,则以前是这样编制索引的,或者应用了显式映射。在Kibana开发工具中运行
GET/demo7/_mapping
,并使用字段
externaldata
的映射结果更新您的问题。感谢leandrojmp关于mapping comment,这是我的新概念。请检查我的编辑1部分,并向我建议更新所有查询文档的方法。我一次又一次地执行相同的管道,但什么也没发生。它始终只更新1个文档:(